在Java中对两个List <long>对象进行AND运算</long>

时间:2014-12-12 09:12:19

标签: java

我想在两个List<Long> Java对象之间执行AND操作。可以说我有

List<Long> groupBits1 = Arrays.asList(new Long[]{Long.valueOf(1L), Long.valueOf(0L), Long.valueOf(0L), Long.valueOf(0L), Long.valueOf(0L)});

List<Long> groupBits2 = Arrays.asList(new Long[]{Long.valueOf(2L), Long.valueOf(1L), Long.valueOf(0L), Long.valueOf(0L), Long.valueOf(0L)});

现在有没有一种方法,Java列表可以在两者之间执行AND运算,而无需单独对索引进行AND运算?

e.g。

之类的东西
List<Long> groupBits3 = groupBits1 & groupBits2; 

和groupBits3将具有以下位

groupBits1.get(0) & groupBits2.get(0), groupBits1.get(1) & groupBits2.get(1), ...等等

2 个答案:

答案 0 :(得分:2)

唯一的方法是遍历两个列表并在每对之间执行按位。这可以通过循环来完成。

List<Long> listAnd = new ArrayList<>(groupBits1.size());
for(int i = 0; i < groupBits1.size(); i++) {
    listAnd.add(groupBits1.get(i) & groupBits2.get(i));
}

使用,您可以使用新的Stream API在单行中执行此操作。

List<Long> listAnd = IntStream.range(0, groupBits1.size())
                .mapToObj(x -> groupBits1.get(x) & groupBits2.get(x))
                .collect(Collectors.toList());

由于Arrays.asList返回固定大小的ArrayList,get是O(1)操作,因此不会出现性能问题。

另请注意,Arrays.asList可以将varargs参数作为参数。由于Java会根据需要自动将基元打包到对象(从Java 5开始),您可以简单地执行:

List<Long> groupBits1 = Arrays.asList(1L, 0L, 3L, 0L, 0L);
List<Long> groupBits2 = Arrays.asList(2L, 1L, 2L, 0L, 0L);

答案 1 :(得分:1)

使用以下内容:

groupBits1.retainAll(groupBits2)

Every List implements the set interface.

  

s1.containsAll(s2) - 如果s2是s1的子集,则返回true。 (如果set s1包含s2中的所有元素,则s2是s1的子集。)

     

s1.addAll(s2) - 将s1转换为s1和s2的并集。 (两个集合的并集是包含任一集合中包含的所有元素的集合。)

     

s1.retainAll(s2) - 将s1转换为s1和s2的交集。 (两个集合的交集是仅包含两个集合共有的元素的集合。)

     

s1.removeAll(s2) - 将s1转换为s1和s2的(非对称)集合差异。 (例如,s1减去s2的设定差异是包含s1中但在s2中找不到的所有元素的集合。)