2016-02-29 66 views
2

重複的變量中的條件是否有使用或無渣在條件重複變量的方式:使用邏輯或不需要在Java

例如

if(x != 5 || x != 10 || x != 15) 

,而不是使用像

if x not in [5,10,15] 
+1

有沒有「不」構建在Java中,我知道的。如果你有很多的比較做出,只是把可能的值在http://docs.oracle.com/javase/7/docs/api/java/util/Set.html – seand

+0

或List https://開頭因爲'x'總是以不同的一個docs.oracle.com/javase/7/docs/api/java/util/List.html#contains(java.lang.Object) –

+3

第一次檢查將總是返回TRUE;價值。 – fabian

回答

1

你的第二個例子是將元素存儲在數組中,並檢查是否存在,在這種情況下不需要OR。

如果你想要去的路線,存儲你的元素在List<Integer>和使用contains(Object o)

if(!myList.contains(x)) 
+2

使用Set而不是List;該集合是O(1)。 – seand

+1

@seand不,它不是。 'HashSet'是* O(1)*。 'Set'只是一個沒有性能保證的界面。 – EJP

0

,如果你想排除5所有乘法,你可以試試這個

if(x % 5 != 0) 
+0

良好的觀察,如果OP實際上預期可能的值是這個序列。 – seand

+0

我不認爲OP打算列出所有在他的條件下是5的倍數的整數^^ – MartinS

0

如果你想要的是,如果x不是{5,10,15}中的任何一個,則返回true,然後通過創建一個集合(set或list,無關緊要)並使用contains方法來實現。

替代用於初始化集合包括使用Arrays.asList

if (!Arrays.asList(5, 10, 15).contains(x)) { 

或使用番石榴(從com.google.common.collect

if (!Sets.newHashSet(5, 10, 15).contains(x)) { 

請注意,您的第一個表達式(x != 5 || x != 10 || x != 15)沒有做到像「X不是什麼[5,10,15]「,如果你認爲它確實存在,那麼你就會誤解布爾邏輯。如果將10傳遞到表達式中,則一旦子表達式評估爲真,則評估短路10,則不等於5,因此x != 5評估爲真,並且OR停止評估,因爲它已經被發現是真的,所以沒有理由繼續進行。你想要的是

(x != 5 && x != 10 %% x != 15) 

或等價

(!(x == 5 || x == 10 || x == 15)) 
4

您可以利用短路終端操作的Java8流(見Stream Operations section in the Stream Package Description瞭解詳情。)例如:

int x = 2; 

// OR operator 
boolean bool1 = Stream.of(5, 10, 15).anyMatch(i -> i == x); 
System.out.println("Bool1: " +bool1); 

// AND operator 
boolean bool2 = Stream.of(5, 10, 15).allMatch(i -> i != x); 
System.out.println("Bool2: " +bool2); 

它產生以下輸出:

Bool1: false 
Bool2: true 
0

這裏自帶的不是用流或一個HashMap的那些性能開銷少得多的解決方案:

要在數組覈對,寫一個小功能檢查 x是否是其中

存儲值這些值

private static boolean isNotIn(int x, int[] values) { 
    for (int i : values) { 
     if (i == x) { 
      return false; 
     } 
    } 
    return true; 
} 



if (isNotIn(x, new int[] {5, 10, 15})) { 
    ... 
} 

相比原代碼的開銷是最小的,可忽略不計,如果你能拉出陣列爲常數。 我還發現這是更好的比其他的解決方案,以閱讀,但認爲是一個非常主觀的意見;-)