2008-08-28 8 views

Respuesta

3

Encontré un hilo con un grupo de chicos de Perl que discutían el lanzamiento de esta pregunta al http://www.perlmonks.org/?node_id=336331.

Espero que esto no sea demasiado sin respuesta a la pregunta, pero diría que tiene un pequeño problema porque sería un algoritmo muy abierto que podría tener un montón de ' falla tanto como golpes. Por ejemplo, digamos que usted entrara: -

camelCase("hithisisatest"); 

La salida podría ser: -

"hiThisIsATest" 

O: -

"hitHisIsATest" 

No hay manera de que el algoritmo sabría qué preferir. Podría agregar un código adicional para especificar que preferiría palabras más comunes, pero fallarían otra vez (Peter Norvig escribió un corrector ortográfico muy pequeño en http://norvig.com/spell-correct.html que podría ayudar a algoritmo, escribí C# implementation si C# es su idioma).

Estoy de acuerdo con Mark y digo que sería mejor tener un algoritmo que tomara una entrada delimitada, es decir, this_is_a_test y la convirtiera. Eso sería fácil de implementar, es decir, en pseudocódigo: -

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

También puede sustituir a mi función capitaliseFirstLetter() con un algoritmo adecuado caso, si así lo deseaban.

A C# implementación del algoritmo descrito anteriormente es como sigue (programa de consola completa con arnés de prueba): -

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

La única manera de hacer eso, sería ejecutar cada sección de la palabra a través de un diccionario.

"mynameisfred" es solo una serie de caracteres, dividiéndolo en mi nombre Is Fred significa entender lo que significa la unión de cada uno de esos caracteres.

Puede hacerlo fácilmente si su entrada se separó de alguna manera, p. "mi nombre es Fred" o "my_name_is_fred".

Cuestiones relacionadas