Алгоритм для форматирования текста к Паскалю или преобразованию регистра верблюда

С весны 3 все ресурсы должны отображаться по-другому. Вы должны использовать тег, чтобы указать расположение ресурсов.

Пример:

<mvc:resources mapping="/resources/**" location="/resources/" />

Таким образом вы направляете сервлет диспетчера для поиска ресурсов каталога для поиска статического содержимого.

8
задан Community 23 May 2017 в 11:45
поделиться

2 ответа

Я нашел поток с набором парней Perl, обсуждающих бросок по этому вопросу по http://www.perlmonks.org/?node_id=336331.

Я надеюсь, что это не слишком много неответа на вопрос, но я сказал бы, что у Вас есть определенная проблема, в которой это был бы очень открытый алгоритм, который мог иметь много 'промахов', а также хитов. Например, скажите, что Вы ввели:-

camelCase("hithisisatest");

Вывод мог быть:-

"hiThisIsATest"

Или:-

"hitHisIsATest"

Нет никакого способа, которым знал бы алгоритм, чтобы предпочесть. Вы могли добавить некоторый дополнительный код, чтобы указать, что Вы предпочтете более общие слова, но снова отсутствуете, произошел бы (Peter Norvig переписал очень маленький орфографический корректор по http://norvig.com/spell-correct.html, который мог бы помочь мудрый алгоритмом, я записал реализацию C# если Ваш язык C#).

Я согласился бы с Mark и сказал бы, что Вы будете более обеспеченным наличием алгоритма, который берет разграниченный вход, т.е. 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);
  }
}
3
ответ дан 6 December 2019 в 00:59
поделиться

Единственный способ сделать, который должен был бы выполнить каждый раздел слова через словарь.

"mynameisfred" является просто массивом символов, разделение его на мое Имя Является средствами Fred понять то, что означает присоединение каждого из тех символов.

Вы могли сделать это легко, если бы Ваш вход был разделен в некотором роде, например, "мое имя является fred" или "my_name_is_fred".

0
ответ дан 6 December 2019 в 00:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: