如何比较两个或更多List(整数)是否相等?

时间:2015-08-21 08:00:46

标签: java algorithm sorting compare

我要比较两个或更多像List'<'Integer'>' l1,列表l2,列表l3 ......,但如何比较它们?

在我看来,首先是Collections.sort(列表),然后是l1.euqals(l2),依此类推...... 但它似乎不是有效的方式,它花费大约O(n ^ 2),并且没有两个列表,它可能是三个或四个或更多......

Anthoer Way正在使用足够多的max Array A init Zero,首先A [l1.get(i)]填充A数字Not-Zero,然后A [l2.get(i)]填充Zero,最后,如果数组A仍然满零,则两个列表相等。它花费了O(n),但问题不仅仅是两个List ......

有没有快速有效的方式,只能按时花费更少? 我希望我能清楚地表达自己的想法。希望能够回答!

1 个答案:

答案 0 :(得分:0)

假设你有一个

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;
}

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

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

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