Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.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 8 然后比较vs排序_Java 8_Comparable - Fatal编程技术网

Java 8 然后比较vs排序

Java 8 然后比较vs排序,java-8,comparable,Java 8,Comparable,两个版本的性能、顺序等是否存在任何差异: 第1版: mylist.sort(myComparator.sort_item); mylist.sort(myComparator.sort_post); 第2版: // java 8 mylist.sort(myComparator.sort_item .thenComparing(myComparator.sort_post)); 来自Java 8 API文档: [然后比较]返回一个字典顺序比较器与另一个字典顺序比较器

两个版本的性能、顺序等是否存在任何差异:

第1版:

mylist.sort(myComparator.sort_item);
mylist.sort(myComparator.sort_post);
第2版:

// java 8
mylist.sort(myComparator.sort_item
            .thenComparing(myComparator.sort_post));

来自Java 8 API文档:

[然后比较]返回一个字典顺序比较器与另一个字典顺序比较器 比较器。如果该比较器认为两个元素相等,即。 比较a,b==0,其他用于确定顺序

这意味着只有当第一个比较器返回0且元素相等时,才使用第二个比较器。所以在实践中,在大多数情况下,它应该比调用sort两次更快


从理论上讲,如果排序算法的时间复杂度为C,那么调用它两次仍然是C常量乘法并不重要,因为两种排序方法的复杂度是相同的

来自Java 8 API文档:

[然后比较]返回一个字典顺序比较器与另一个字典顺序比较器 比较器。如果该比较器认为两个元素相等,即。 比较a,b==0,其他用于确定顺序

这意味着只有当第一个比较器返回0且元素相等时,才使用第二个比较器。所以在实践中,在大多数情况下,它应该比调用sort两次更快


从理论上讲,如果排序算法的时间复杂度为C,那么调用它两次仍然是C常量乘法并不重要,因为两种排序方法的复杂度是相同的

Version 1:您正在按项目排序,然后将该排序丢弃,改为按帖子排序。实际上,第一类是毫无意义的


版本2:您首先按项目排序,如果出现平局,则使用post打破平局。

版本1:您按项目排序,然后放弃排序,改为按post排序。实际上,第一类是毫无意义的



版本2:你先按项目排序,如果出现平局,就用post打破平局。

我不明白你所说的无意义是什么意思。mylist的对象有两个属性item和post,我想先用item comparator对mylist进行排序,然后用post comparator对其进行排序,版本1不会这样做。@nimo23我不知道为什么这不是公认的答案-这完美地解释了您的问题。我之所以说第一种排序没有意义,是因为无法保证排序方法是稳定的排序。可能是默认实现确实是稳定的。但这不能保证。@JoeC:这是一个规范缺陷。Collections.sort的文档声明它保证是稳定的,但在最新版本中,它只是委托给List.sort,显然期望它是稳定的,尽管List.sort的文档对此不太清楚。我不理解你所说的无意义是什么意思。mylist的对象有两个属性item和post,我想先用item comparator对mylist进行排序,然后用post comparator对其进行排序,版本1不会这样做。@nimo23我不知道为什么这不是公认的答案-这完美地解释了您的问题。我之所以说第一种排序没有意义,是因为无法保证排序方法是稳定的排序。可能是默认实现确实是稳定的。但这不能保证。@JoeC:这是一个规范缺陷。Collections.sort的文档声明它保证是稳定的,但在最新版本中,它只是委托给List.sort,显然期望它是稳定的,尽管List.sort的文档对此不太清楚。所以这意味着,两个版本返回的结果相同?不,它们不一样。@nimo23它们几乎是稳定的。根据Java8,List接口现在有一个稳定的默认方法sort。这意味着,如果先按sort_post排序,然后再按sort_项排序,则结果与版本2中使用链式比较器排序相同。请注意版本1中的相反顺序。因此我必须使用mylist.sortmyComparator.sort\u post。然后使用ComparingMyComparator.sort\u item;,如果我想像1版那样排序。是的。但不要相信我的话,试一试,看看会发生什么。这意味着,两个版本返回的结果相同?不,它们不一样。@nimo23它们几乎是一样的。根据Java8,List接口现在有一个稳定的默认方法sort。这意味着,如果先按sort_post排序,然后再按sort_项排序,则结果与版本2中使用链式比较器排序相同。请注意版本1中的相反顺序。因此我必须使用mylist.sortmyComparator.sort\u post。然后使用ComparingMyComparator.sort\u item;,如果我想像1版那样排序。是的。但别相信我的话,试试看,看看会发生什么。