Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 比较两个非常大的列表的最佳方法_Java_Performance_List_Collections_Comparison - Fatal编程技术网

Java 比较两个非常大的列表的最佳方法

Java 比较两个非常大的列表的最佳方法,java,performance,list,collections,comparison,Java,Performance,List,Collections,Comparison,我有两个非常大的清单。比如说几百万个元素。两个列表已按相同方式排序。现在我需要检查两个列表是否相等。 最好的方法是什么? 现在我的想法是使用Assert.assertEquals对行进行比较 for(int i=0;i<Math.max(list1.size(),list2.size()),i++){ Assert.assertEquals(list1.get(i),list2.get(i)); } for(int i=0;i一种更简单的方法是以列表的大小为中心,您正在使用: if(l

我有两个非常大的清单。比如说几百万个元素。两个列表已按相同方式排序。现在我需要检查两个列表是否相等。 最好的方法是什么? 现在我的想法是使用Assert.assertEquals对行进行比较

for(int i=0;i<Math.max(list1.size(),list2.size()),i++){

Assert.assertEquals(list1.get(i),list2.get(i));
}

for(int i=0;i一种更简单的方法是以列表的大小为中心,您正在使用:

if(list1.size() > list2.size()) {
    list1.removeAll(list2);
    // print the list1 (discrepancies)
    Assert.fail("Lists are not equal");
} else if
...// same for list2.size() > list1.size()
} else {
    list1.removeAll(list2);
     if(!list1.isEmpty()) { 
        // print the discrepancies
        Assert.fail("Lists are not equal");
     } 
}

一种更简单的方法是以列表的大小为中心,您无论如何都在使用该列表:

if(list1.size() > list2.size()) {
    list1.removeAll(list2);
    // print the list1 (discrepancies)
    Assert.fail("Lists are not equal");
} else if
...// same for list2.size() > list1.size()
} else {
    list1.removeAll(list2);
     if(!list1.isEmpty()) { 
        // print the discrepancies
        Assert.fail("Lists are not equal");
     } 
}

您应该将它们存储在二叉树中。与列表相比,搜索速度非常快。

您应该将它们存储在二叉树中。与列表相比,搜索速度非常快。

性能主要取决于收集和执行它所使用的方法

正如您提到的代码,它正在使用list的get方法进行迭代和比较,我们需要知道实现list的哪个集合类对于get方法具有更好的性能

for(int i=0;i<Math.max(list1.size(),list2.size()),i++){
    Assert.assertEquals(list1.get(i),list2.get(i));
}

for(int i=0;i性能将主要取决于集合和执行该类的方法

正如您提到的代码,它正在使用list的get方法进行迭代和比较,我们需要知道实现list的哪个集合类对于get方法具有更好的性能

for(int i=0;i<Math.max(list1.size(),list2.size()),i++){
    Assert.assertEquals(list1.get(i),list2.get(i));
}
for(int i=0;i最后,如果列表相等,则为O(n)操作。因此,我将采用简单的方法,简单地使用:

Assert.assertEquals(list1, list2);
这将依赖于
List::equals
来比较列表-我怀疑你能比这更有效,除非你有关于列表内容的具体信息

如果列表不相等,您应该得到一个显示差异的异常。

最后,如果列表相等,这是一个O(n)操作。因此,我将采用简单的方法并简单地使用:

Assert.assertEquals(list1, list2);
这将依赖于
List::equals
来比较列表-我怀疑你能比这更有效,除非你有关于列表内容的具体信息


如果两个列表不相等,您应该得到一个显示差异的异常。

这很简单:当您想确保两个列表相等时,您必须对它们进行元素比较。当然,只有当两个列表的大小相等时,您才会这样做

所以你总是处理O(n)

Java ArrayList已经是一个很好的数据结构选择

唯一可能的优化:使用多线程比较子列表可以更快地解决此问题。因此,parallelStream()可能是您的朋友


可选地,当列表包含int、双…原始值时,你可以考虑使用普通的旧数组而不是基于集合的列表。

非常简单:当你想确定两个列表是相等的时,你必须将它们按元素进行比较。当然,只有当两个列表具有相同的大小时,你才这样做。 所以你总是处理O(n)

Java ArrayList已经是一个很好的数据结构选择

唯一可能的优化:使用多线程比较子列表可以更快地解决此问题。因此,parallelStream()可能是您的朋友



可选地,当列表包含INT、双…原始值时,您可以考虑使用普通的旧数组而不是基于集合的列表。

是AARYLIST还是LINKEDLIST?@ RaJuthHARMA ARLYISITIS IT ARAYLIST或LINKEDLIST?@ RaJujHARMA ARLYLARSTARYRALISTIGO GET方法,然后性能顺序将为O(1)。.overall?@nullpointer是的,实现ArrayList的List的get方法比实现LinkedList的List的get方法性能更好。此处不讨论比较,但总体顺序不会是
O(1)
即使我们在
ArrayList
@nullpointer上执行
get
,我说的是单次获取..我确实修改了samarraylist get方法,那么性能顺序将是O(1).overall?@nullpointer是的,实现ArrayList的List的get方法比实现LinkedList的List的get方法性能更好。此处不讨论比较,但总体顺序不会是
O(1)
即使我们在
ArrayList
@nullpointer上执行
get
,我说的是单次获取..我确实修改了相同的内容。他主要是问性能。你的代码在幕后做了很多事情。不确定这有多大帮助。他主要是问性能。你的代码在幕后做了很多事情。不是s你知道这有多大帮助。如果列表不相等,你应该得到一个显示差异的例外。聪明:)在众多答案中,只有一个是真正有意义的(imho)。缺少的一件事…您可能希望提及使断言工作所需的先决条件。OP可能不需要,但将来的读者可能需要。不确定您的意思,什么先决条件?如果列表不相等,您应该得到一个显示差异的异常。聪明:)在众多答案中,只有一个是真正有意义的(imho).缺少的一件事…你可能想提及使断言工作所需的先决条件。可能不是OP所需的,而是未来读者所需的。不确定你的意思,什么先决条件?胡说。他问如何有效地比较两个大列表。将它们变成树根本没有帮助。胡说。他是询问如何有效地比较两个大的列表。将它们变成树并没有任何帮助。