Comparable和Comparator的使用方法
阿新 • • 發佈:2018-12-16
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的簡單用法。