我想在两个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),
...等等
答案 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));
}
使用java-8,您可以使用新的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中找不到的所有元素的集合。)