老师好,我想问一下,以后讲 Collection 的时候会提到 Comparable 和 Comparator 吗?我对比较器怎么实现排序有点晕。比如:
//这是名为 Guy 的 Class↓
public class Guy implements Comparable<Guy>{
private String name;
private int height;
public Guy(String name, int height){
this.name = name;
this.height = height;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getHeight() {return height;}
public void setHeight(int height) {
this.height = height;
}
@Override
public String toString() {
return "Guy{" +
"name='" + name + '\'' +
", height=" + height +
'}';
}
@Override
//按照身高从高到矮排序
public int compareTo(Guy o) {
if (this.height >= o.height)
return -1;
else
return 1;
}
}
//这是测试 Guy 排序的 Class↓
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class TestGuy {
public static void main(String[] args) {
List<Guy> guys = new ArrayList<>();
//10个170以上的人
for (int i = 0; i < 10; i++) {
guys.add(new Guy("Person " + i, 170 + i));
}
//使用 sort,按照身高从高到矮排序
Collections.sort(guys);
System.out.println(guys);
}
}
我的问题是,怎么样判断是按照从小到大排序,还是从大到小排序?在上面的例子里,如果把 public int compareTo() 的地方改成:
public int compareTo(Guy o) {
if (o.height >= this.height)
return -1;
else
return 1;
}
那么,就是按照身高从矮到高排序了,感觉不是很懂。而且修改返回值的正负也会影响排序,那么,在 public int compareTo() 里面,返回值 1 和 -1,以及 0,代表的是什么意思?
就是这里有点疑点,希望老师能解答一下。
展开
作者回复: 首先必须提出表扬。代码,结果,问题都说的很清楚,而且明显是经过了思考和学习后提出的问题,是一个优质的问题。人工点赞👍
说回问题本身。collection的sort是递增排序(asc),也就是从小到大。如果要改变循序,可以通过改变compareTo的逻辑。
两个实例的大小,就是通过conpareTo判断的。compareTo中1代表本实例大于参数传来的实例,0代表等于,-1代表小于。
你的实现里有个小问题,在等于的情况下应该返回0。碰巧你的例子里面没有身高相等的,所以不会发现问题。
有问题欢迎补充。