Domanda

Utilizzando questa domanda come base c'è un alogrithm o esempio di codifica per modificare il testo di Pascal o di Cammello corpo.

Per esempio:

mynameisfred

diventa

Camel: myNameIsFred
Pascal: MyNameIsFred
È stato utile?

Soluzione

Ho trovato un thread con un mazzo di Perl ragazzi sostenendo il lancio su questa domanda, oltre a http://www.perlmonks.org/?node_id=336331.

Spero che questo non è troppo di una non-risposta alla domanda, ma direi che hai un po 'di un problema che sarebbe molto aperta algoritmo che potrebbe avere un sacco di "incidenti" così come colpisce.Per esempio, dire che è inseriti:-

camelCase("hithisisatest");

L'output può essere:-

"hiThisIsATest"

O:-

"hitHisIsATest"

Non c'è alcun modo l'algoritmo dovrebbe sapere che cosa scegliere.Si potrebbe aggiungere qualche codice aggiuntivo per specificare che preferisci di più delle parole di uso comune, ma manca ancora potrebbe verificarsi (Peter Norvig ha scritto un piccolo correttore ortografico oltre a http://norvig.com/spell-correct.html che potrebbe aiuto algoritmo-saggio, ho scritto un Implementazione C# se C#e'il tuo linguaggio).

Io sono d'accordo con Marco e dire che sarebbe meglio avere un algoritmo che prende un determinato input, cioèthis_is_a_test e la converte.Sarebbe semplice da realizzare, cioèin pseudocodice:-

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

Si potrebbe anche sostituire il mio capitaliseFirstLetter() funzione con un apposito caso algoritmo, se lo si desidera.

A C# attuazione di quanto sopra descritto l'algoritmo è il seguente (compilare la console di programma con test harness):-

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

Altri suggerimenti

L'unico modo per farlo sarebbe quello di eseguire ogni sezione della parola attraverso un dizionario.

"mynameisfred" è solo un array di caratteri, la suddivisione in il mio Nome È Fred significa comprendere che cosa l'adesione di ciascuno di questi personaggi.

Si potrebbe fare facilmente se l'input è stato separato in qualche modo, ad es."il mio nome è fred" o "my_name_is_fred".

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top