-2

这是我的代码:

Scanner s = new Scanner(System.in);
int t = s.nextInt();
String [] pair_left = new String[t];
String [] pair_right = new String[t];

for (int i = 0; i < t; i++) {
    pair_left[i] = s.next();
    pair_right[i] = s.next();
}
HashSet hs1=new HashSet();
HashSet hs2=new HashSet();
int j=0;
for(int i=0;i<t;i++){
    if(hs1.add(pair_left[i])||hs2.add(pair_right[i])){
      j++;
      System.out.println(j);
    }
    else {      
       System.out.println(j);
    }
}

输入是:

5
john tom
john mary
john tom
mary anna
mary anna

现在当i=2thenhs1.add(pair_left[i])返回 false 然后它会返回 'false'hs2.add(pair_right[i])所以hs1.add(pair_left[i])||hs2.add(pair_right[i])应该返回 'false' 但在我的情况下它显示true。为什么?

当我用按位或替换逻辑或时,它会显示正确的结果。如果有任何更好的方法可以做到这一点,那么也可以提供。

4

1 回答 1

1

您应该知道||逻辑 OR 是短路的,因此如果hs1.add(pair_left[i])返回 true,hs2.add(pair_right[i])则不会进行评估。

另一方面,正如您所注意到的,当您使用|非短路逻辑或(请注意,这不仅|是按位或)时,两个操作数总是被计算。

于 2016-07-25T11:59:52.687 回答