Java中列表上的AND / OR操作

时间:2015-03-27 09:43:00

标签: java list java-8

考虑两位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吗? 请给我最有效的方法来获得答案。

4 个答案:

答案 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);