2016-02-29 67 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})) { 
    ... 
} 

相比原代码的开销是最小的,可忽略不计,如果你能拉出阵列为常数。 我还发现这是更好的比其他的解决方案,以阅读,但认为是一个非常主观的意见;-)