考虑两位arraylists。
ArrayList<Integer> list1 = new ArrayList<Integer>();
list1.add(1);
list1.add(2);
list1.add(3);
ArrayList<Integer> list2 = new ArrayList<Integer>();
list2.add(3);
list2.add(4);
list2.add(5);
我想在这些列表之间执行AND和OR操作。 例如, 这里当我执行AND操作b / w list1&amp; list2输出应该是一个只包含3的列表 当我执行OR操作时b / w list1&amp; list2输出应该是一个包含1,2,3,4,5(不是3次重复两次)的列表。
Java中是否有可能实现这种情况?在这种情况下我们可以使用Java 8 Streams吗? 请给我最有效的方法来获得答案。
答案 0 :(得分:5)
使用Stream API:
List<Integer> union = Stream.concat(list1.stream(), list2.stream())
.distinct()
.collect(Collectors.toList());
List<Integer> intersection = list1.stream()
.filter(list2::contains)
.collect(Collectors.toList());
没有Stream API:
List<Integer> intersection = new ArrayList<>(list1);
intersection.retainAll(list2);
List<Integer> union = new ArrayList<>(list1);
List<Integer> toAdd = new ArrayList<>(list2);
toAdd.removeAll(list1); // avoid duplicates
union.addAll(toAdd);
答案 1 :(得分:2)
您需要使用Set
来避免重复。然后,只需使用addAll()
,removeAll()
和retainAll()
操作即可。
答案 2 :(得分:1)
如果确实坚持使用Streams,请按以下步骤操作:
对于 AND ,您可以执行以下操作:
List<Integer> AND = list1.stream()
.filter(list2:contains)
.collect(Collectors.toList());
对于 OR ,你可以这样做:
List<Integer> OR = Arrays.asList(list1, list2)
.stream()
.flatMap(List::stream)
.distinct()
.collect(Collectors.toList());
甚至更好,正如@Alexis C.所建议并受@aioobe启发:
List<Integer> OR = Stream.concat(list1.stream(), list2.stream())
.distinct()
.collect(Collectors.toList());
答案 3 :(得分:1)
它可能很有用:
Set<Integer> orSet = new HashSet<Integer>();
orSet.addAll(list);
orSet.addAll(list1);
List<Integer> orList = new ArrayList<Integer>(orSet);
List<Integer> andList = new ArrayList<Integer>();
int i=0;
Iterator<Integer> itr = list.iterator();
while(itr.hasNext()){
int v = itr.next();
if(list1.contains(v)){
andList.add(v);
}
}
System.out.println(orList);
System.out.println(andList);