【问题标题】:check for duplicate lists Java 8检查重复列表 Java 8
【发布时间】:2017-04-23 08:35:38
【问题描述】:

给定 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 来实现?

【问题讨论】:

  • 它们是否需要以相同的顺序才能被视为重复?
  • @shmosel 根据 OP 代码,它们不应该(OP 在比较它们之前将列表转换为集合)。
  • @Eran 对。如果 OP 确认,我将删除我的答案。
  • @Eran 你说得对。修复它
  • @shmosel 不,顺序无关紧要

标签: java list arraylist java-8 duplicates


【解决方案1】:

由于在您的 Java 7 代码中,您在比较 Lists 之前将它们转换为 Sets,因此您似乎想要检查输入 Lists 中是否至少有 2 个具有相同的元素集(忽略重复或顺序)。

您可以在 Java 8 中通过流式传输 List 并将其转换为 StreamSets 来实现此目的。那么你所要做的就是找出不同的Sets 的数量是否小于输入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

【讨论】:

  • 你可以使用HashSet::new
【解决方案2】:

我从@Eran 对整数数组的回答中得到启发,它奏效了。 代码是:

int a = {1,2,3,4,5};
boolean isAnyDuplicate = Arrays.stream(a).distinct().count() < a.length;
System.out.println("First is" + isAnyDuplicate);
int b = {1,2,2,4,5};
isAnyDuplicate = Arrays.stream(b).distinct().count() < b.length;
System.out.println("Second is" + isAnyDuplicate);

【讨论】:

    猜你喜欢
    • 2018-05-29
    • 2020-09-06
    • 2017-01-28
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-08
    相关资源
    最近更新 更多