2014-12-19 34 views
2

我在想如何改進我的程序的一部分,但我想知道是否有這種「銀色子彈」案例。有沒有什麼策略可以避免這樣的大if OR statements?:替代if(something || somethingElse || somethingElse2 || somethingElse3 ...)

public boolean containsCharOfWord() { 
     if (this.name.contains("b") || this.name.contains("a") 
       || this.name.contains("c") || this.name.contains("t") 
       || this.name.contains("e") || this.name.contains("r") 
       || this.name.contains("i") || this.name.contains("a")) { 
      return true; 
     } 
     return false; 
    } 

謝謝大家!

+3

通用替換,或專門爲多個'String.contains()'? – 2014-12-19 09:52:58

+1

並使這些char值中的常量不變。 – aurelius 2014-12-19 09:54:13

+3

對於特定的情況,這是非常明顯的:正則表達式。 'name.matches( 「* [abceirt]。*」)'。 – 2014-12-19 09:54:48

回答

4

Guava

return CharMatcher.anyOf("bacteria").matchesAnyOf(name); 

花哨的版本將是

private static final CharMatcher VIRUS = CharMatcher.anyOf("bacteria").precomputed(); 

... return VIRUS.matchesAnyOf(name); 

在預先計算返回更快的匹配器。

+1

+ public static final String BACTERIA =「bacteria」; – aurelius 2014-12-19 09:55:11

+3

這是一個小細節,真的。它也可能來自配置文件,數據庫或其他。 – 2014-12-19 09:55:42

+1

我看到他們使用排序的'char []'和二進制搜索。這是非常有效的,但不像['BitSet'支持的解決方案](http://stackoverflow.com/questions/27555895/is-it-possible-to-check-if-a-char-matches-a -list-的-possiblities/27556584#27556584)。 – 2014-12-19 09:58:40

1

首先,刪除一個this.name.contains( 「A」),因爲是重複的

,那麼你可以試試開關(JDK7)

switch (name) { 
    case "b": 
     // do something 
    case "a": 
     // do something 
    case "c": 
     // do something 
    case "t": 
     // do something 
    case "e": 
     // do something 
    case "r": 
     // do something 
    case "i": 
     // do something 
    } 
+0

相當遠離公佈的要求。使用'for'循環並打開'String.charAt()'來作出明智的回答。 – 2014-12-19 10:01:16

+0

如果名稱是「細菌」,該怎麼辦?你只匹配一個字符。 – 2014-12-19 10:01:19

+2

你也忘了'break;'在每種情況下 – Lucas 2014-12-19 10:07:19

3

你應該嘗試使用正則表達式

public boolean containsCharOfWord() { 
     return this.name.matches("(.*)([bacteria])(.*)"); 
} 
+1

@ZouZou當然,我剛剛從OP拷貝了代碼,卻沒有多少考慮。現在更正。 – 2014-12-19 10:07:34

1

你想概括在一系列字符,可能是在名稱:

public boolean containsAnyCharOfWord(String word) { 
    for (int i = 0; i < word.length(); i++) { 
     if (this.name.contains(String.valueOf(word.charAt(i)))) { 
      return true; 
     } 
    } 
    return false; 
} 

public boolean containsCharOfWord() { 
    return containsAnyCharOfWord("bacteri"); // don't need to check for 'a' twice 
} 
+2

工作但很慢('O(m * n)')。 'String.valueOf'使它非常糟糕。使用'String#indexOf(char)'。 – maaartinus 2014-12-19 10:08:34

+0

OP並沒有要求這個特定問題的最佳解決方案,他問道:「是否有任何策略避免這樣的OR語句大?」。這就是我的答案所解決的問題;其他任何事情都是通過解決非常不同的事情來分散注意力。 – 2014-12-19 12:09:29

1

沒有任何外部庫:使用正則表達式匹配/模式匹配:即, 「我的字符串是否與任何上述字符匹配」?

myString.matches(".*[bacteria].*") 
+1

慢...每次編譯正則表達式。 – maaartinus 2014-12-19 10:09:53

+1

OP詢問短代碼,不是快速執行。可以選擇預編譯模式並應用它。但根據上下文,這可能是更多的代碼而不是問題的保證。 – Antares42 2014-12-19 10:11:13

+0

是的,很棒的東西。現在這只是評論中解決方案的一個不足之處。 – 2014-12-19 10:17:14