03月15, 2020

Java - Collections类中的sort, min, max方法详解

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坐标最小的点。

参考资料

Collections (Java Platform SE 7)

本文链接:http://blog.zireaels.com/post/java-collections-sort.html

-- EOF --

Comments