Java: String: есть ли лучший способ сравнить строки - PullRequest
2 голосов
/ 15 декабря 2010

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

if(TAG_PLAY.equalsIgnoreCase(e.getActionCommand())
   ||TAG_PASSWORD.equalsIgnoreCase(e.getActionCommand())
   ||...
){

У меня есть догадка, что это можно улучшить, сделав что-то вроде создание 1 большой строки и поиск в ней e.getActionCommand () но я не знаю, будет ли это более эффективным

Примечание: это не имеет ничего общего с getActionCommand, меня просто интересуют логика, производительность и новые способы / шаблоны, чтобы сделать то же самое


Редактировать: я не рассматриваю дебаты в верхнем и нижнем регистре ^^


Редактировать:

Как насчет этого:

s = TAG_PLAY+","+TAG_PASSWORD;
//compareToIgnoreCase is not optimal since it will go through all the String
    if(0!=s.compareToIgnoreCase(anotherString)){

Ответы [ 4 ]

8 голосов
/ 15 декабря 2010

Рассматривали ли вы использование Set.contains (Object)?

Например:

  Set<String> cases = new HashSet<String>();
  cases.add( TAG_PLAY.toLowerCase() );
  cases.add( TAG_PASSWORD.toLowerCase() );

  ...
  if ( cases.contains( e.getActionCommand().toLowerCase() ) { 
  ...
5 голосов
/ 15 декабря 2010

Если вы реализуете структуру данных для сопоставления строк, вам, вероятно, понадобится Trie некоторого вида.

Если вы просто хотите сделать это в Java без кучикод, бросить все строки, с которыми вы хотите сопоставить в наборе, а затем проверьте, находится ли ваша целевая строка в наборе.

0 голосов
/ 15 декабря 2010

Вы могли бы сделать

final String upperCaseCommand = e.getActionCommand().toUpperCase();
if(TAG_PLAY.equals(upperCaseCommand)
   ||TAG_PASSWORD.equals(upperCaseCommand)
   ||...
 ){

(Конечно, константы также должны быть в верхнем регистре.

Вы также можете поместить их в хеш.

if (tags.containsKey(upperCaseCommand))
0 голосов
/ 15 декабря 2010

Это выглядит как хороший кандидат для enum . Простой пример:

public enum TagType
{
  TAG_PLAY,
  TAG_PASSWORD
}

Тем не менее, вы можете подробно остановиться на этом. Перечисления Java обеспечивают производительность целых чисел (для сравнения), а также безопасность типов и поведение объектов. Вам не придется беспокоиться о том, что эквивалент e.getActionCommand() не является действительным TAG, поскольку он безопасен для типов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...