java的Collections类提供了sort方法来对List排序,以及min、max方法求Collection对象的最小/大值。
方法定义
每个方法都有两个重载,其中第一个要求对象类具有Comparable接口,而第二个不要求,可以自定义比较器Comparator。
public static <T extends Comparable<? super T>> void sort(List<T> list)
public static <T> void sort(List<T> list, Comparator<? super T> c)
public static <T extends Object & Comparable<? super T>> T min(Collection<? extends T> coll)
public static <T> T min(Collection<? extends T> coll, Comparator<? super T> comp)
public static <T extends Object & Comparable<? super T>> T max(Collection<? extends T> coll)
public static <T> T max(Collection<? extends T> coll, Comparator<? super T> comp)
Comparable接口
当方法不需要输入Comparator时,需要输入列表中的对象具有Comparable接口,比如定义下面这个类:
class Stu implements Comparable<Stu>{
String name;
int score;
public Stu(String name, int score){
this.name=name;
this.score=score;
}
@Override
public int compareTo(Stu n){
return this.score-n.score;
}
}
覆写的compareTo方法指定了若给定两个实例,用何种方法比较它们的"大小",有点类似于python中的key=lambda x:x.score
,不过这里的compareTo能更好地自定义。它的返回值指定了两个实例比较时,交换他们的位置(返回值小于0)或是不交换(返回值大于0)。
例子
import java.util.*;
public class test{
public static void main(String[] args){
Stu a = new Stu("a", 99);
Stu b = new Stu("b", 95);
Stu c = new Stu("c", 100);
List<Stu> l = new ArrayList<Stu>();
l.add(a);
l.add(b);
l.add(c);
Collections.sort(l);
print.printList(l);//自定义的方法
}
}
class Stu implements Comparable<Stu>{
String name;
int score;
public Stu(String name, int score){
this.name=name;
this.score=score;
}
@Override
public int compareTo(Stu n){
return this.score-n.score;
}
}
输出为
b 95
a 99
c 100
Comparator
当输入Comparator参数时,要排序的列表中的对象类就不需要具有Comparable接口了,而是通过Comparator方法决定两个实例的"大小"关系。例如我在软件构造Lab1中写的如下代码:
Point first=Collections.min(points, new Comparator<Point>() {
@Override
public int compare(Point o1, Point o2) {
if(o1.x()<o2.x()) return -1;
if(o1.x()==o2.x()) return o1.y()<o2.y()?-1:1;
return 1;
}
});
在Comparator下覆写一个compare方法,与上面的Comparable接口类似,返回值小于0则交换,大于0则不交换。这行代码的作用为找到x与y坐标最小的点。
Comments