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的简单用法。