2012-04-16 87 views
2

當你有很長的IfElse時,哪一種方法可以做到這一點?IfElse或正則表達式

 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而不是每次運行該方法時重新創建它。

編輯
繼評論,這是事實,什麼是自主相當於使用條件與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)的攤銷效率。 – 2012-04-16 13:01:20

+1

從javadoc:「這個類爲基本操作(添加,刪除,包含和大小)提供了恆定的時間性能,假設散列函數在桶之間正確地分散元素。」 - 對於字符串應該是這種情況。 – assylias 2012-04-16 13:02:02

+0

我的不好。我把它們與C++集混淆了,它們「通常作爲二叉查找樹實現」。 – 2012-04-16 13:06:34