2009-10-08 2 views
7

Какой способ капитализации лучше?Строка капитализируется - лучший способ

шахта:

char[] charArray = string.toCharArray(); 
charArray[0] = Character.toUpperCase(charArray[0]); 
return new String(charArray);

или

Обще языки - StringUtils.capitalize:

return new StringBuffer(strLen) 
      .append(Character.toTitleCase(str.charAt(0))) 
      .append(str.substring(1)) 
      .toString();

Я думаю, что у меня это лучше, но я предпочел бы спросить.

+9

Вопрос-ответ: строковая капитализация действительно является узким местом в вашем приложении? –

+0

Я понимаю, что это не имеет большого значения, но если бы я написал любую библиотеку, я бы постарался сделать ее максимально эффективной. – IAdapter

+6

Забавный. Если * I * будет писать библиотеку, я постараюсь сделать ее * работу * максимально возможной. – Bombe

ответ

2

Производительность равна.

Ваш код копирует символ [], вызывающий string.toCharArray() и new String(charArray).

Код apache по buffer.append(str.substring(1)) и buffer.toString(). Код apache имеет дополнительный экземпляр строки, который имеет базовое значение char [1, length]. Но это не будет скопировано при создании экземпляра String.

0

Вы приурочили оба?

Честно говоря, они эквивалентны .. поэтому тот, который работает лучше для вы это лучше один :)

+2

Остерегайтесь, что языковые возможности для сравнения производительности очень сложны на Java, см. Эту очень хорошую статью Брайана Гетца: http://www.ibm.com/developerworks/java/library/j-jtp12214/index.html?S_TACT=105AGX02&S_CMP=EDU – Jesper

+2

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

1

StringBuffer объявляется поточно, так что может быть менее эффективным в использовании (но не стоит делать ставку на нее, прежде чем делать некоторые практические тесты).

7

Я предполагаю, что ваша версия будет немного более результативной, поскольку она не выделяет столько временных объектов String.

я бы пойти на это (предполагая, что строка не пуста):

StringBuilder strBuilder = new StringBuilder(string); 
strBuilder.setCharAt(0, Character.toUpperCase(strBuilder.charAt(0)))); 
return strBuilder.toString(); 

Однако, обратите внимание, что они не эквивалентны в том, что один использует toUpperCase() и другие виды использования toTitleCase().

С forum post:

Titlecase <> прописные
Юникода определяет три вида случая отображения: в нижнем регистре, верхний регистр, и titlecase. Разницы между и верхним регистром titlecasing символом или символом последовательностью можно увидеть в соединении символов (то есть, один символа, который представляет собой compount из двух символов).

Например, в Юникоде символ U + 01F3 - LATIN SMALL LETTER DZ. (Позвольте нам написать этот составной символ с использованием ASCII как «dz».) Этот символ
верхние части к символу U + 01F1, LATIN CAPITAL LETTER DZ. (Что
в основном "DZ".) Но titlecases к для символов U + 01F2, LATIN CAPITAL
ПИСЬМО D С прописной буквы Z. (который мы можем написать "ДЗ".)

character uppercase titlecase 
--------- --------- --------- 
dz  DZ  Dz 
+0

Не могли бы вы предоставить более подробную информацию о различии между toUpperCase() и toTitleCase()? –

+3

Добавлена ​​некоторая дополнительная информация. – Lucero

+1

Код Apache, вероятно, был написан для версии 1.4 или ранее. В реализации Sun тогда код Apache не создавал бы временные 'char []' массивы (как 'String.substring', так и (первоначально)' StringBuffer.toString'. Таким образом, код Apache был до 2004 года быстрее для больших строк. –

0

Не знаете, какова разница между toppccase и toTitleCase, но похоже, что для вашего решения требуется меньше экземпляров класса String, а для реализации общих прав требуется два (подстрока и toString создают новые строки, которые я предполагаю, поскольку String is неизменный).

Является ли это «лучше» (я думаю, вы имеете в виду быстрее) Я не знаю. Почему бы вам не профилировать оба решения?

1

StringBuilder (начиная с Java 5) быстрее, чем StringBuffer, если вам не нужно быть потокобезопасным, но, как говорили другие, вам нужно проверить, лучше ли это в вашем решении.

3

Если бы я написал библиотеку, я попытался бы удостовериться, что я получил право на Unicode, беспокоясь о производительности. С верхней части моей головы:

int len = str.length(); 
if (len == 0) { 
    return str; 
} 
int head = Character.toUpperCase(str.codePointAt(0)); 
String tail = str.substring(str.offsetByCodePoints(0, 1)); 
return new String(new int[] { head }).concat(tail); 

(. Я бы, наверное, и посмотреть разницу между заголовком и заглавными буквами, прежде чем я совершил)

0

использовать этот метод для капитализации строки. его полностью работает без каких-либо ошибок

public String capitalizeString(String value) 
{ 
    String string = value; 
    String capitalizedString = ""; 
    System.out.println(string); 
    for(int i = 0; i < string.length(); i++) 
    { 
     char ch = string.charAt(i); 
     if(i == 0 || string.charAt(i-1)==' ') 
      ch = Character.toUpperCase(ch); 
     capitalizedString += ch; 
    } 
    return capitalizedString; 
} 
0
/** 
    * capitalize the first letter of a string 
    * 
    * @param String 
    * @return String 
    * */ 
    public static String capitalizeFirst(String s) { 
     if (s == null || s.length() == 0) { 
      return ""; 
     } 
     char first = s.charAt(0); 
     if (Character.isUpperCase(first)) { 
      return s; 
     } else { 
      return Character.toUpperCase(first) + s.substring(1); 
     } 
    } 
0

Если вы только прописные букв ограниченных слов, лучше кэш его.

@Test 
public void testCase() 
{ 
    String all = "At its base, a shell is simply a macro processor that executes commands. The term macro processor means functionality where text and symbols are expanded to create larger expressions.\n" + 
      "\n" + 
      "A Unix shell is both a command interpreter and a programming language. As a command interpreter, the shell provides the user interface to the rich set of GNU utilities. The programming language features allow these utilities to be combined. Files containing commands can be created, and become commands themselves. These new commands have the same status as system commands in directories such as /bin, allowing users or groups to establish custom environments to automate their common tasks.\n" + 
      "\n" + 
      "Shells may be used interactively or non-interactively. In interactive mode, they accept input typed from the keyboard. When executing non-interactively, shells execute commands read from a file.\n" + 
      "\n" + 
      "A shell allows execution of GNU commands, both synchronously and asynchronously. The shell waits for synchronous commands to complete before accepting more input; asynchronous commands continue to execute in parallel with the shell while it reads and executes additional commands. The redirection constructs permit fine-grained control of the input and output of those commands. Moreover, the shell allows control over the contents of commands’ environments.\n" + 
      "\n" + 
      "Shells also provide a small set of built-in commands (builtins) implementing functionality impossible or inconvenient to obtain via separate utilities. For example, cd, break, continue, and exec cannot be implemented outside of the shell because they directly manipulate the shell itself. The history, getopts, kill, or pwd builtins, among others, could be implemented in separate utilities, but they are more convenient to use as builtin commands. All of the shell builtins are described in subsequent sections.\n" + 
      "\n" + 
      "While executing commands is essential, most of the power (and complexity) of shells is due to their embedded programming languages. Like any high-level language, the shell provides variables, flow control constructs, quoting, and functions.\n" + 
      "\n" + 
      "Shells offer features geared specifically for interactive use rather than to augment the programming language. These interactive features include job control, command line editing, command history and aliases. Each of these features is described in this manual."; 
    String[] split = all.split("[\\W]"); 

    // 10000000 
    // upper Used 606 
    // hash Used 114 

    // 100000000 
    // upper Used 5765 
    // hash Used 1101 

    HashMap<String, String> cache = Maps.newHashMap(); 

    long start = System.currentTimeMillis(); 
    for (int i = 0; i < 100000000; i++) 
    { 

     String upper = split[i % split.length].toUpperCase(); 

//   String s = split[i % split.length]; 
//   String upper = cache.get(s); 
//   if (upper == null) 
//   { 
//    cache.put(s, upper = s.toUpperCase()); 
// 
//   } 
    } 
    System.out.println("Used " + (System.currentTimeMillis() - start)); 
} 

Текст снят с here.

В настоящее время мне нужно, чтобы в верхнем регистре имя таблицы и столбцы было много раз, но они ограничены. Используйте кеш-кеш для кэширования.

:-)