Question

À l'aide de cette question comme la base est là une alogrithm ou de codage par exemple pour changer un peu de texte à Pascal ou à dos de Chameau boîtier.

Par exemple:

mynameisfred

devient

Camel: myNameIsFred
Pascal: MyNameIsFred
Était-ce utile?

La solution

J'ai trouvé un thread avec un tas de Perl gars en arguant de la jeter sur cette question plus à http://www.perlmonks.org/?node_id=336331.

J'espère que ce n'est pas trop de non-réponse à la question, mais je dirais que vous avez un certain problème en ce qu'elle serait une très ouvertes algorithme qui peut avoir beaucoup de 'manque' ainsi que des hits.Par exemple, disons que vous avez saisi:-

camelCase("hithisisatest");

La sortie peut être:-

"hiThisIsATest"

Ou:-

"hitHisIsATest"

Il n'y a aucun moyen de l'algorithme de savoir qui préfèrent.Vous pourriez ajouter un peu de code supplémentaire pour indiquer que vous préférez le plus commun des mots, mais encore une fois manque pourraient se produire (Peter Norvig a écrit un très petit correcteur orthographique sur au http://norvig.com/spell-correct.html qui peut l'aide de l'algorithme sage, j'ai écrit un C# de mise en œuvre si C#'s votre langue).

Je serai d'accord avec Mark et dire que vous feriez mieux de disposer d'un algorithme qui prend un délimitée d'entrée, c'est à direthis_is_a_test et la convertit.Ce serait simple à mettre en œuvre, c'est à direen pseudo-code:-

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)]

Vous pouvez aussi remplacer mon capitaliseFirstLetter() fonction avec un bon cas de l'algorithme si vous le souhaitait.

A C# de mise en œuvre de l'algorithme décrit ci-dessus est comme suit (compléter le programme en mode console avec harnais de test):-

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);
  }
}

Autres conseils

La seule façon de le faire serait d'exécuter chaque section de la parole par le biais d'un dictionnaire.

"mynameisfred" est juste un tableau de caractères, de le diviser en mon Nom Est Fred, c'est comprendre ce que l'adhésion de chacun de ces caractères moyens.

Vous pourriez le faire facilement si votre entrée a été séparé, d'une certaine façon, par exemple"mon nom est fred" ou "my_name_is_fred".

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top