检查重复列表Java 8

时间:2016-12-08 07:10:06

标签: java list arraylist java-8 duplicates

给定n个列表,我想知道是否有任何两个列表具有完全相同的元素。下面是Java 7中的代码。

public static <T> boolean hasduplicateList(List<List<T>> lists) {
    for (List<T> outerList : lists) {
        int count = 0;
        Set<T> outerSet = new HashSet<>(outerList);
        for (List<T> innerList : lists) {
            Set<T> innerSet = new HashSet<>(innerList);
            if (outerSet.equals(innerSet)) {
                count++;
            }
            if (count == 2) {
                return true;
            }
        }
    }
    return false;
}

有没有更好的方法来实现特别使用Java8?

2 个答案:

答案 0 :(得分:6)

由于您在Java 7代码中将List转换为Set s,然后再进行比较,因此您似乎需要检查输入List中是否至少有2个相同的元素集(忽略重复或顺序)。

您可以通过流式传输List并将其转换为Stream Set来在Java 8中实现此目的。然后你要做的就是找出不同的Set s的数量是否小于输入List的大小:

public static <T> boolean hasduplicateList(List<List<T>> lists) {
  return 
    lists.stream()  // create a <Stream<List<T>>
         .map(HashSet::new) // transform Stream<List<T>> to Stream<HashSet<T>> 
         .distinct() // keep only distinct Sets
         .count() < lists.size();
}

测试:

public static void main (String[] args)
{ 
    List<String> alist = Arrays.asList ("a","b","c");
    List<String> blist = Arrays.asList ("b","c","c","a");
    List<String> clist = Arrays.asList ("e","d","c","a");
    List<List<String>> llist1 = Arrays.asList (alist,blist);
    List<List<String>> llist2 = Arrays.asList (alist,clist);
    System.out.println ("has dups? " + hasduplicateList (llist1));
    System.out.println ("has dups? " + hasduplicateList (llist2));
}

输出:

has dups? true
has dups? false

答案 1 :(得分:0)

我从@Eran的答案中得到了一个整数数组的启发,它起作用了。 代码是:

v