Comparable和Comparator的使用方法

Comparable和Comparator

Comparable是java.lang包中的一个接口,当我们对某个集合中的元素做排序操作的时候,要告诉程序如何进行排序。比如是用名字的长度还是名字的字典顺序排序。某些类型java已经帮我们实现了默认的Comparable接口中的compareTo方法,例如String类型,是根据字典顺序排序的。在我们自己写的类要实现排序功能时,可以implements Comparable,然后实现compareTo方法的具体排序逻辑。

public class Song implements Comparable{
    private String name;
    private String artist;
    private int time;
    private int rating;

    public Song(String name, String artist, int time, int rating) {
        this.name = name;
        this.artist = artist;
        this.time = time;
        this.rating = rating;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getArtist() {
        return artist;
    }

    public void setArtist(String artist) {
        this.artist = artist;
    }

    public int getTime() {
        return time;
    }

    public void setTime(int time) {
        this.time = time;
    }

    public int getRating() {
        return rating;
    }

    public void setRating(int rating) {
        this.rating = rating;
    }

    @Override
    public String toString() {
        return "Song{" +
                "name='" + name + '\'' +
                ", artist='" + artist + '\'' +
                ", time=" + time +
                ", rating=" + rating +
                '}';
    }


    @Override
    public int compareTo(Song o) {
        return name.compareTo(o.getName());
    }
}

以上代码段是一个Song类,实现了Comparable接口,所以当我们在测试代码中使用Colllections.sort方法时,它会知道如何排序。

public class SortDemo {
    public static void main(String[] args) {
        List list=new ArrayList();
        list.add("eee");
        list.add("fff");
        list.add("aaa");
        list.add("bbb");
        System.out.println(list);
        Collections.sort(list);
        System.out.println(list);
    }
}
//控制台结果
[eee, fff, aaa, bbb]
[aaa, bbb, eee, fff]

当我们想对不同的属性分别进行排序时,例如业务需求中可以对姓名进行排序,也可以对年龄进行排序,这时候就需要用到Comparator接口。Comparator接口在java.util包中,也是一个泛型接口。我们需在这里插入代码片要做的是定义一个新的比较器,并且implements Comparator,实现compare方法。
例如我想对歌曲名称进行排序。

public class NameComparator implements Comparator {
    @Override
    public int compare(Song o1, Song o2) {
        return o1.getName().compareTo(o2.getName());
    }
}

例如我又想对分数进行排序。

public class RatingComparator implements Comparator {
    @Override
    public int compare(Song o1, Song o2) {
        return o2.getRating()-o1.getRating();
    }
}

然后再排序时可以用Collections.sort的重载方法,两个参数的。

public class SortDemo {
    public static void main(String[] args) {
        Song one =new Song("seven11","jayzhou",189,3);
        Song two =new Song("ashole","ajax",260,5);
        Song three =new Song("kitneay","spring",145,4);
        Song four =new Song("hadoop","mybatis",90,1);
        List list=new ArrayList<>();
        list.add(one);
        list.add(two);
        list.add(three);
        list.add(four);
        System.out.println(list);
        Collections.sort(list,new RatingComparator());
        System.out.println(list);
    }
}

就可以对Song实现按照分数排序,如果我们想对名字进行排序,只要传入名字比较器即可。

Collections.sort(list,new NameComparator());

以上是Comparable和Comparator的简单用法。

你可能感兴趣的:(javaSE)