【问题标题】:How to compare that two or more List(Integer) are equal? [duplicate]如何比较两个或多个 List(Integer) 是否相等? [复制]
【发布时间】:2015-11-15 02:23:23
【问题描述】:

我不得不比较两个或多个 Set like List'' l1,List l2,List l3 ...,但是如何比较它们呢?

在我看来,首先是 Collections.sort(list),然后是 l1.euqals(l2),依此类推... 但是好像不是有效的方法,花费大约O(n^2),而且没有两个List,可能是三个四个甚至更多...

Anthoer Way 使用了额外的最大数组 A 初始化零,首先 A[l1.get(i)] 用非零数字填充,然后 A[l2.get(i)] 用零填充,最后,如果数组 A 仍然充满零,则两个列表相等。而且它的成本是 O(n),但麻烦的不仅仅是两个 List...

有没有什么快速有效的方法,而且时间成本更低? 我希望我能清楚地表达我的想法。Hope ans!

【问题讨论】:

  • Set#equals() 在 Java 中没有考虑元素的顺序,因此不需要排序。
  • @JordiCastilla 这个问题大约是 n > 2 套,这与您发布的链接中的问题不同(比较 两个 套)。
  • @JordiCastilla ,@laune 是的,我需要比较像 List 这样的集合而不是 Set。
  • @xiaocainiao 请google一下,如果你知道如何比较两个,你可以应用相同的机制来比较三个或更多......

标签: java algorithm sorting compare


【解决方案1】:

假设你有一个

List<Collection<X>> listOfColls

并且需要知道它们是否都相等。列表或集合相等的前提条件是它们具有相等数量的元素。所以

public static <X> boolean allequal( List<Collection<X>> listOfColls ){
    if( listOfColls.size() <= 1 ) return true;
    int nel = listOfColls.get(0).size();
    for( int i = 1; i < listOfColls.size(); ++i ){
        if( listOfColls.get(i).size() != nel ) return false;
    }
    for( int i = 1; i < listOfColls.size(); ++i ){
        if( ! listOfColls.get(i).equals( listOfColls.get(0) ) ) return false;
    }
    return true;
}

在一组不完全相等的列表或集合中,您至少有一个具有不同基数的可能性很高。这就是为什么平均而言,在调用 equals n-1 次之前快速检查此属性可能是有利的。

但是请注意,集合的实际类会影响equals 的工作方式。对于集合,它是不适用顺序的集合比较。对于列表,顺序是相关的,并且您可能有重复(相等)的元素。您可能必须通过对 List 进行排序或将其转换为 Set 来预处理...

对于 equals 本身,依靠 List 或 Set 实现来做最好的事情。不应该重写 JDK 的类方法——那些程序员很难超越。

【讨论】:

  • 我需要比较像 List 这样的集合而不是 Set。
  • OK - 实际上这应该适用于集合列表 - List 和 Set 也是如此
  • 你写了“比较两个或多个集合”。下定决心! - 重点是您是否需要“设置语义”而不是“列表语义”。
  • 您的答案似乎有效,而且比较时间更少。非常感谢!如果 Set compare 确实需要排序,但 list compare 似乎需要排序,
  • 与我的答案相比,我将添加一些 Set 与 List 不同语义的提示。
猜你喜欢
  • 2010-12-05
  • 2014-09-20
  • 1970-01-01
  • 2013-08-18
  • 1970-01-01
  • 2012-03-25
  • 2017-09-22
  • 2021-05-23
  • 1970-01-01
相关资源
最近更新 更多