java – 为什么Collections.sort用相同的参数调用Comparator两次?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – 为什么Collections.sort用相同的参数调用Comparator两次?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2329字,纯文字阅读大概需要4分钟。
内容图文
![java – 为什么Collections.sort用相同的参数调用Comparator两次?](/upload/InfoBanner/zyjiaocheng/796/b6b3d957e2a64210b56aa848e795f907.jpg)
我正在运行一个示例来了解Comparator在Java中的行为.
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
class HDTV {
private int size;
private String brand;
public HDTV(int size, String brand) {
this.size = size;
this.brand = brand;
}
public int getSize() {
return size;
}
public void setSize(int size) {
this.size = size;
}
public String getBrand() {
return brand;
}
public void setBrand(String brand) {
this.brand = brand;
}
}
class SizeComparator implements Comparator<HDTV> {
@Override
public int compare(HDTV tv1, HDTV tv2) {
int tv1Size = tv1.getSize();
int tv2Size = tv2.getSize();
System.out.println("Comparing :: "+tv1.getBrand()+" AND : "+tv2.getBrand());
if (tv1Size > tv2Size) {
return 1;
} else if (tv1Size < tv2Size) {
return -1;
} else {
return 0;
}
}
}
public class HelloWorld {
public static void main(String[] args) {
HDTV tv1 = new HDTV(55, "Samsung");
HDTV tv2 = new HDTV(60, "Sony");
HDTV tv3 = new HDTV(42, "Panasonic");
ArrayList<HDTV> al = new ArrayList<HDTV>();
al.add(tv1);
al.add(tv2);
al.add(tv3);
Collections.sort(al, new SizeComparator());
for (HDTV a : al) {
System.out.println(a.getBrand());
}
}
}
输出是
Comparing :: Sony AND :Samsung
Comparing :: Panasonic AND : Sony
Comparing :: Panasonic AND : Sony
Comparing :: Panasonic AND : Samsung
Panasonic
Samsung
Sony
为什么连续2次比较松下和索尼的两个对象?
我发现没有必要这样做.
解决方法:
如果这是Java 7或更高版本,则使用TimSort. TimSort首先运行输入并检测或收集32个或更多元素的升序(在此实现中).请参阅源代码中的countRunAndMakeAscending.
目前,已有超过32次的运行.通过对当前运行中的后续元素进行二进制插入排序来延长小于32的运行,直到它至少为32个元素长.请参阅源代码中的binarySort.
(合并排序方法仅在收集> = 32的运行后才完成.由于您的输入只有3个元素,因此整个排序是使用二进制插入排序完成的,并且不进行合并.)
countRunAndMakeAscending必须做的是通过比较相邻元素来检测运行.首先,它将索尼与三星,松下与索尼进行比较.结果是长度为2,[三星,索尼].
接下来,binarySort通过使用下一个元素Panasonic,并将其插入正确的位置来延长此运行时间.进行二分查找以找到该位置. 2的运行中点是位置1,这是索尼,因此它将松下与索尼进行比较. (这是重复的比较.)松下比索尼少,所以下一个比较是在松下和三星之间,这决定了正确的插入点.我们现在有一个长度为3的运行.
由于整个输入的长度为3,因此在四次比较后完成排序.
由于countRunAndMakeAscending和binarySort是单独的排序阶段,因此发生重复比较,并且恰好第一阶段的最后一次比较与第二阶段的第一次比较相同.
内容总结
以上是互联网集市为您收集整理的java – 为什么Collections.sort用相同的参数调用Comparator两次?全部内容,希望文章能够帮你解决java – 为什么Collections.sort用相同的参数调用Comparator两次?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。