2012-04-16 10 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

보통 elseIf 긴 문 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 
} 

당신이 소형을 좋아하는 경우에

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

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

를 그리고, 당신은 또한 쓸 수 있습니다 :

4

(1) 나는 개인적으로 내가 읽기 쉽게 생각하는 집합을 사용하고 contains는 O에서 효율적입니다

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

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

마지막으로 동일한 목록을 항상 사용하는 경우 메서드를 실행할 때마다 키워드를 다시 만들지 않고 private static final으로 만들 수 있습니다. 코멘트 다음

편집
, 무슨 위에있는 것은 text.equals("xxx")하지 text.contains("xxx")와 조건을 사용하는 것과 같습니다 것이 사실이다. 당신이 정말로 포함 사용하는 것을 의미한다면, 당신은 세트 반복하고 각 문자열을 테스트해야하지만,이 O (n)이 작동된다 :

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

세트가 내부적으로 이진 트리로 저장되어 있기 때문에 실제로는 O (log n)라고 생각합니다. HashTable은 O (1)의 효율성을 상각합니다. –

+1

javadoc에서 : "이 클래스는 기본 연산 (추가, 제거, 포함 및 크기)에 대해 일정 시간 성능을 제공합니다. 해시 함수가 버킷간에 요소를 적절하게 분산 시킨다고 가정합니다."- 문자열의 경우이어야합니다. – assylias

+0

제 잘못입니다. 나는 이들을 "바이너리 검색 트리로 일반적으로 구현되는"C++ 세트와 혼동했다. –