سؤال

باستخدام هذا السؤال كقاعدة، يوجد خوارزمية أو مثال ترميزي لتغيير بعض النص إلى غلاف Pascal أو Camel.

على سبيل المثال:

mynameisfred

يصبح

Camel: myNameIsFred
Pascal: MyNameIsFred
هل كانت مفيدة؟

المحلول

لقد وجدت موضوعًا مع مجموعة من رجال بيرل يتجادلون حول هذا السؤال في http://www.perlmonks.org/?node_id=336331.

آمل ألا يكون هذا بمثابة إجابة على السؤال، ولكن أود أن أقول إن لديك مشكلة صغيرة حيث أنها ستكون خوارزمية مفتوحة للغاية ويمكن أن تحتوي على الكثير من "الأخطاء" أيضًا كما يضرب.على سبيل المثال، لنفترض أنك أدخلت: -

camelCase("hithisisatest");

يمكن أن يكون الإخراج: -

"hiThisIsATest"

أو:-

"hitHisIsATest"

من المستحيل أن تعرف الخوارزمية ما تفضله.يمكنك إضافة بعض التعليمات البرمجية الإضافية لتحديد أنك تفضل المزيد من الكلمات الشائعة، ولكن مرة أخرى قد تحدث أخطاء (كتب بيتر نورفيج مصححًا إملائيًا صغيرًا جدًا في http://norvig.com/spell-correct.html أيّ قد مساعدة من حيث الخوارزمية، كتبت أ تنفيذ C# إذا كانت لغة C# هي لغتك).

أتفق مع مارك وأقول أنه من الأفضل أن يكون لديك خوارزمية تأخذ مدخلات محددة، على سبيل المثال.this_is_a_test ويحول ذلك.سيكون ذلك سهل التنفيذ، على سبيل المثال.في الكود الزائف:-

SetPhraseCase(phrase, CamelOrPascal):
    if no delimiters
     if camelCase
      return lowerFirstLetter(phrase)
     else
      return capitaliseFirstLetter(phrase)
    words = splitOnDelimiter(phrase)
    if camelCase 
      ret = lowerFirstLetter(first word) 
     else
      ret = capitaliseFirstLetter(first word)
    for i in 2 to len(words): ret += capitaliseFirstLetter(words[i])
    return ret

capitaliseFirstLetter(word):
    if len(word) <= 1 return upper(word)
    return upper(word[0]) + word[1..len(word)]

lowerFirstLetter(word):
    if len(word) <= 1 return lower(word)
    return lower(word[0]) + word[1..len(word)]

يمكنك أيضًا استبدال وظيفتي CapitaliseFirstLetter()‎ بخوارزمية حالة مناسبة إذا كنت ترغب في ذلك.

تنفيذ C# للخوارزمية الموصوفة أعلاه هو كما يلي (برنامج وحدة التحكم الكامل مع أداة الاختبار): -

using System;

class Program {
  static void Main(string[] args) {

    var caseAlgorithm = new CaseAlgorithm('_');

    while (true) {
      string input = Console.ReadLine();

      if (string.IsNullOrEmpty(input)) return;

      Console.WriteLine("Input '{0}' in camel case: '{1}', pascal case: '{2}'",
        input,
        caseAlgorithm.SetPhraseCase(input, CaseAlgorithm.CaseMode.CamelCase),
        caseAlgorithm.SetPhraseCase(input, CaseAlgorithm.CaseMode.PascalCase));
    }
  }
}

public class CaseAlgorithm {

  public enum CaseMode { PascalCase, CamelCase }

  private char delimiterChar;

  public CaseAlgorithm(char inDelimiterChar) {
    delimiterChar = inDelimiterChar;
  }

  public string SetPhraseCase(string phrase, CaseMode caseMode) {

    // You might want to do some sanity checks here like making sure
    // there's no invalid characters, etc.

    if (string.IsNullOrEmpty(phrase)) return phrase;

    // .Split() will simply return a string[] of size 1 if no delimiter present so
    // no need to explicitly check this.
    var words = phrase.Split(delimiterChar);

    // Set first word accordingly.
    string ret = setWordCase(words[0], caseMode);

    // If there are other words, set them all to pascal case.
    if (words.Length > 1) {
      for (int i = 1; i < words.Length; ++i)
        ret += setWordCase(words[i], CaseMode.PascalCase);
    }

    return ret;
  }

  private string setWordCase(string word, CaseMode caseMode) {
    switch (caseMode) {
      case CaseMode.CamelCase:
        return lowerFirstLetter(word);
      case CaseMode.PascalCase:
        return capitaliseFirstLetter(word);
      default:
        throw new NotImplementedException(
          string.Format("Case mode '{0}' is not recognised.", caseMode.ToString()));
    }
  }

  private string lowerFirstLetter(string word) {
    return char.ToLower(word[0]) + word.Substring(1);
  }

  private string capitaliseFirstLetter(string word) {
    return char.ToUpper(word[0]) + word.Substring(1);
  }
}

نصائح أخرى

الطريقة الوحيدة للقيام بذلك هي تشغيل كل قسم من الكلمة من خلال القاموس.

"mynameisfred" هي مجرد مجموعة من الأحرف، وتقسيمها إلى My Name Is Fred يعني فهم ما يعنيه انضمام كل من هذه الأحرف.

يمكنك القيام بذلك بسهولة إذا تم فصل مدخلاتك بطريقة ما، على سبيل المثال."اسمي فريد" أو "my_name_is_fred".

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top