2012-04-16 4 views
2

Какой из них был бы лучшим способом сделать это, если у вас очень длинный IfElse?IfElse или regex

 if (text.contains("text")) 
     { 
      // do the thing 
     } 
     else if (text.contains("foo")) 
     { 
      // do the thing 
     } 
     else if (text.contains("bar")) 
     { 
      // do the thing 
     }else ... 

Или

 if (text.contains("text") || text.contains("foo") || ...) 
     { 
      // do the thing 
     } 

Или, может быть,

 Pattern pattern = Pattern.compile("(text)|(foo)|(bar)|..."); 
     Matcher matcher = pattern.matcher(text); 
     if(matcher.find()) 
     { 
      // do the thing 
     } 

И я имею в виду только, когда вы должны проверить, много из них. Благодаря!

ответ

0

Обычно длинные Ifelse заявлений заменяются case заявления, но это не всегда возможно. Если мне порекомендую, я бы пошел на второй вариант, вариант 1 даст вам кучу If else if else операторов, которые делают то же самое, а для третьего случая регулярные выражения имеют тенденцию расти довольно крупными довольно быстро.

Опять же, в зависимости от того, сколько alot, в конечном итоге было бы лучше просто выбросить все ваши строки в структуру данных и перебрать их, чтобы увидеть, находится ли элемент в нем.

0
String[] storage = { 
    "text", 
    "foo", 
    "bar", 
    "more text" 
}; 

for(int i=0; i < storage.length(); i++){ 
    //Do Something 
} 

Помогает ли это?

4

Я бы лично использовать набор, как я думаю, что это легче читать и contains будет эффективным в O (1):

Set<String> keywords = new HashSet<String>(); 
keywords.add("text"); 
keywords.add("foo"); 
keywords.add("bar"); 

if(keywords.contains(text)) { 
    //do your thing 
} 

И если вам это нравится компактный, вы также можете написать:

Set<String> keywords = new HashSet<String>(Arrays.asList("text", "foo", "bar")); 

if(keywords.contains(text)) { 
    //do your thing 
} 

И, наконец, если вы всегда используете один и тот же список, вы можете создавать ключевые слова private static final вместо воссоздания его каждый раз, когда вы запускаете метод.

EDIT
После комментария, это правда, что то, что выше эквивалентно использованию условия с text.equals("xxx"), не text.contains("xxx"). Если вы действительно хотели использовать содержит, то вам придется перебрать набор и проверить каждую строку, но она становится O (п) операции:

for (String key : keywords) { 
    if (text.contains(key)) { 
     //do your stuff 
     break; 
    } 
} 
+0

Я думаю, что это на самом деле O (log n), потому что набор хранится внутри как двоичное дерево. Однако HashTable амортизирует эффективность O (1). –

+1

Из javadoc: «Этот класс предлагает постоянную производительность времени для основных операций (добавление, удаление, содержит и размер), предполагая, что хеш-функция правильно распределяет элементы среди ведер». Это должно быть в случае со строками. – assylias

+0

Мой плохой. Я смешивал их с наборами C++, которые «обычно реализуются как двоичные деревья поиска». –

Смежные вопросы