我要比较两个或更多像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 ......
有没有快速有效的方式,只能按时花费更少? 我希望我能清楚地表达自己的想法。希望能够回答!
答案 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类方法 - 那些程序员很难超越。