1. 程式人生 > >Comparable和Comparator的使用方法

Comparable和Comparator的使用方法

Comparable和Comparator

Comparable是java.lang包中的一個介面,當我們對某個集合中的元素做排序操作的時候,要告訴程式如何進行排序。比如是用名字的長度還是名字的字典順序排序。某些型別java已經幫我們實現了預設的Comparable介面中的compareTo方法,例如String型別,是根據字典順序排序的。在我們自己寫的類要實現排序功能時,可以implements Comparable,然後實現compareTo方法的具體排序邏輯。

public class Song implements Comparable<Song>{
    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<String> list=new ArrayList<String>();
        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<Song> {
    @Override
    public int compare(Song o1, Song o2) {
        return o1.getName().compareTo(o2.getName());
    }
}

例如我又想對分數進行排序。

public class RatingComparator implements Comparator<Song> {
    @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<Song> 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的簡單用法。