2014-08-27 25 views
0

我试图写作为输入2个整数数组和基于每个元件之间的二进制&对它们进行比较和考虑到如果一个阵列从另一来源的方法。数组的大小也是已知的并且相等。因此,基本上如果该方法将A = [2,0,0,0]和B = [6,0,0,3]作为输入,则它应该返回true,因为(2 &6)!= 0(小心如果它采用相反的A = [6,0,0,3]和B = [2,0,0,0],则它应该返回假,因为A是从B(或B包含在A中)。爪哇:两个阵列之间有二进制运算符比较

如果在位于相同位置的两个元素之间应用&运算符(即基本上该方法应该返回true),则数组中包含一个数组。

到目前为止,我已经得到了下面的代码,这显然是因为如果一个阵列从其他来源的它并没有考虑到不能正常工作。我所能想到的所有操作都是可交换的,并没有帮助。

private boolean checkContainment(int[] firstArr, int[] secondArr) 
{ 
    List<Integer> posList = new ArrayList<Integer>(); 

    for(int i = 0;i < firstArr.length;i++) 
    { 
     if((firstArr[i] & secondArr[i]) != 0) 
     { 
      posList.add(i); 
     } 
    } 

    for(int j = 0;j < firstArr.length;j++) 
    { 
     if(posList.size() > 0) 
     { 
      for(int k : posList) 
      { 
       if((j != k) && (firstArr[j] != secondArr[j])) 
       { 
        return true;       
       } 
      } 
     } 
    } 

    return false; 
} 

我敢肯定,这是很简单的调整下面的代码,以获得正确的,但我不能让我的头周围。

+0

*所以基本上如果该方法作为输入A = [2,0,0,0]和B = [6,0,0,3]它应该返回真,因为(2 6)!= 0(小心与括号这里hehe)*。为什么它应该返回'真实'?为什么它应该返回'false'? – 2014-08-27 13:03:45

+1

你能否在这种情况下定义遏制和派生? – user2504380 2014-08-27 13:13:43

+0

它应该返回true,因为(A [0]&B [0])== TRUE,否则当你有(B,A)作为参数时它应该返回FALSE,因为你可以从A派生B,因为B是A加Aka B衍生自A. – Hazerd 2014-08-27 13:27:36

回答

1

我认为您在寻找暗示A意味着B。这是一个按位操作,可让您的示例提供您要查找的结果。正如你和其他人所观察到的,你不能使用&来做到这一点,因为它不会给你想要的结果。

计算A的方法暗示B使用Java按位运算符是~A | B

为逻辑蕴涵真值表见this question。这是关于C/C++的,但原理和位运算符与Java中的几乎相同。

鉴于int a[]与相同长度的int b[],这里有一个快速(的Java 8)的方式在阵列测试所有值按位含义:

IntStream.range(0, a.length) 
    .map(i -> ~a[i] | b[i]) 
    .allMatch(n -> n == ~0) 

注意对~0allMatch谓词测试,因为我们希望测试所有结果值的所有位都是1。