java中sort函数comparator的使用_java – 为什么Collections.sort用相同的参数调用Comparator两次?...

我正在运行一个示例来了解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 {

@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 al = new ArrayList();

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,comparator,comparable

来源: https://codeday.me/bug/20190623/1268469.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值