2016-10-18 2 views
4

Я хочу знать, есть ли способ, которым я мог бы оптимизировать этот код.Как заменить несколько операторов if-else для оптимизации кода?

String[] array; 
for(String s:array){ 
    if(s.contains("one")) 
     //call first function 
    else if(s.contains("two")) 
     //call second function 
    ...and so on 
} 

Строка в основном линии Читаю из file.So может быть много числа lines.And я должен искать определенные ключевые слова в этих строках и вызвать соответствующую функцию.

+0

Вы можете использовать корпус коммутатора вместо этого. Ничто другое не поможет вам !!! – Shivam

+0

Как можно сменить помощь в этом случае.? У меня строка строки, в которой я проверяю подстроку. Это не «точное соответствие». –

+0

Какие существуют функции? У всех есть одна и та же подпись? –

ответ

4

Это не остановит ваш код от выполнения многих String#contains вызовов, однако, это позволит избежать if/else цепочки ..

Вы можете создать ключ-функцию карту, а затем перебрать записи этой карты, чтобы найти, какой метод звонить.

public void one() {...} 
public void two() {...} 
private final Map<String, Runnable> lookup = new HashMap<String, Runnable>() {{ 
    put("one", this::one); 
    put("two", this::two); 
}}; 

Вы можете перебрать запись набора:

for(final String s : array) { 
    for(final Map.Entry<String, Runnable> entry : lookup) { 
     if (s.contains(entry.getKey())) { 
      entry.getValue().run(); 
      break; 
     } 
    } 
} 
+0

, это, безусловно, ухудшит производительность, так как теперь мне придется перебирать всю карту, чтобы получить функцию, которую мне нужно вызвать. Спасибо anyways –

+0

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

+0

С другой мыслью, с несколькими хитростями, это будет служить моей цели. +1 для ответа –

1

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

1

Поскольку вы заявили, что порядок проверки не важно, вы можете использовать комбинацию регулярных выражений и switch:

static final Pattern KEYWORDS=Pattern.compile("one|two|tree|etc"); 

Matcher m=KEYWORDS.matcher(""); 
for(String s:array) { 
    if(m.reset(s).find()) switch(m.group()) { 
     case "one": //call first function 
      break; 
     case "two": //call second function 
      break; 
     case "three": //call third function 
      break; 
     case "etc": // etc 
      break; 
    } 
} 

Поскольку остановится в первом матче, независимо от того, какое ключевое слово, это потенциально более эффективным, чем проверка одного ключевого слова за другим, для строк, содержащих совпадение близко к началу.

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