2011-09-30 31 views
36

一個簡單的問題,但Google一直沒有太大的幫助。在if語句中格式化多個'或'條件的最佳方式(Java)

我有一個if語句與許多條件(有檢查10級或15的常量,看其中是否存在。)

而不是寫類似的:

if (x == 12 || x == 16 || x == 19 || ...) 

有任何方式來格式化它像

if x is [12, 16, 19]? 

只是想知道是否有一個更簡單的方法來編碼,任何幫助表示讚賞。

編輯:這些問題的答案非常有幫助,但我被要求由少數人來增加更多的細節,所以我會做的就是要滿足他們的好奇心。我正在做一個日期驗證課,需要確保在僅有30天的月份(其中有4天,我認爲)的日子不是> 30,並且我正在編寫if語句來檢查這樣的事情:

if (day > 30 && (month == 4 || month == 6 || month == 9 || month == 11)) 

我只是想知道是否有更快的方式來編碼這樣的事情 - 下面的許多答案都有幫助:)。

+0

你能舉一個你想做什麼的更好的例子嗎?也許有一個解決方案在於思考? –

回答

37

我經常使用這種模式。這是非常緊湊:

// Define a constant in your class. Use a HashSet for performance 
private static final Set<Integer> values = new HashSet<Integer>(Arrays.asList(12, 16, 19)); 

// In your method: 
if (values.contains(x)) { 
    ... 
} 

一個HashSet用在這裏得到很好的查詢性能 - 即使是非常大的哈希集是能夠非常快速執行。

如果表現並不重要,你可以在它的要點編寫成一條線:

if (Arrays.asList(12, 16, 19).contains(x)) 

,但知道這將創建執行新ArrayList每次。

+2

if(Arrays.asList(12,16,19).contains(x )) –

+0

布賴恩,我添加了你的建議與性能警告 – Bohemian

+1

我寧願使用Set而不是List來做這件事,但這對於這幾個元素並沒有什麼影響。 –

3

您可以查找映射鍵的存在或查看它是否在一個集合中。

取決於你究竟是什麼,不過,你可能會嘗試解決這個問題錯了:)

3

使用某種類型的集合 - 這將使得代碼更易讀,並掩蓋了所有那些常數。一個簡單的方法是用一個列表:

// Declared with constants 
private static List<Integer> myConstants = new ArrayList<Integer>(){{ 
    add(12); 
    add(16); 
    add(19); 
}}; 

// Wherever you are checking for presence of the constant 
if(myConstants.contains(x)){ 
    // ETC 
} 

波希米亞指出常量的列表可以是靜態的,所以它在不止一個地方的訪問。

對於任何有興趣的人,我的例子中的列表使用double brace initialization。由於我最近碰到它,我發現它很適合編寫快速的&髒列表初始化。

+1

或'if(Arrays.asList(new int [] {12,16,19})。contains(x)){...}' –

+0

@Bala sure!無論如何,列表只是這裏使用的集合的一個例子。作爲其他答案之一建議一組可能會更好,以確保常量是唯一的...或哈希表,以加快查找,等等。 –

10

是否要切換到此?

switch(x) { 
    case 12: 
    case 16: 
    case 19: 
     //Do something 
     break; 
    default: 
     //Do nothing or something else.. 
     break; 
} 
3

如果設定的可能性爲「緊湊型」(即最大值 - 最小值的是,比如說,低於200),你可能會考慮一個查找表。如果你有像

if (x == 12 || x == 16 || x == 19 || ...) 
else if (x==34 || x == 55 || ...) 
else if (...) 

設置的陣列與值識別所述分支的結構要採取(1,2,3在上面的例子中),這將是特別有用然後你的測試變得

switch(dispatchTable[x]) 
{ 
    case 1: 
     ... 
     break; 
    case 2: 
     ... 
     break; 
    case 3: 
     ... 
     break; 
} 

這是否合適取決於問題的語義。

如果數組不合適,您可以使用Map<Integer,Integer>,或者如果您只想測試單個語句的成員資格,則可以使用Set<Integer>。然而,對於一個簡單的if聲明來說,這是一個很大的火力,所以沒有更多的上下文,它很難引導你朝着正確的方向前進。

4

不,你不能用Java做到這一點。但是你可以寫一個方法如下:

boolean isContains(int i, int ... numbers) { 
    // code to check if i is one of the numbers 
    for (int n : numbers) { 
     if (i == n) return true; 
    } 
    return false; 
} 
2

與Java 8中,您可以使用原始數據流:

if (IntStream.of(12, 16, 19).anyMatch(i -> i == x)) 

,但這可能有輕微的開銷(或沒有),這取決於數量的比較。