2016-10-18 4 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

이 경우 케이스 도움말을 전환하는 방법은 무엇입니까? 나는 substring을 검사하고있는 string line을 가지고있다. 그것의 "정확한 일치". –

+0

기능은 무엇입니까? 모두 서명이 똑같습니까? –

답변

4

이 늘는 if/else 체인을 피할 수 있지만, 많은 String#contains 전화를하기에서 당신의 코드를 중지 ..

당신은 찾을 맵의 항목을 반복 한 후 키 기능 맵을 생성 할 수 있습니다

하는 방법 전화하기.

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

이것은 호출 할 필요가있는 함수를 얻기 위해 전체 맵을 반복해야하므로 성능이 확실히 저하 될 것입니다. 고마움 어쨌든 –

+0

두 번째 생각에, 몇 가지 조작과 함께이 내 목적을 제공합니다. –

+0

두 번째로 생각해 보면, 약간의 조정만으로도 내 목적을 달성 할 수 있습니다. +1 대답은 –

1

당신은 스위치를 사용할 수 있지만,이 경우 내가 만약 다른 생각은 당신이 밝혔다 때문에 가장 좋은 방법

1

입니다 수표의 순서는 중요하지 않습니다, 당신은 일치하는 정규식의 조합을 사용할 수 있습니다 switch : 012 이 이후

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; 
    } 
} 

무관 한 키워드, 제 경기에서 정지되며, 그 선두에 가까운 매치를 포함하는 문자열을 잇달아 키워드 의하면보다 잠재적으로 더 효율적이다.