一、 Comparable:是排序接口。若一个类实现了Comparable接口,就意味着该类支持排序。实现了 Comparable接口的类的对象的列表或数组可以通过Collections.sort或Arrays.sort进行自动排序。
此外,实现此接口的对象可以用作有序映射中的键或有序集合中的集合,无需指定比较器。
此接口只有一个方法compare,比较此对象与指定对象的顺序,如果该对象小于、等于或大于指定 对象,则分别返回负整数、零或正整数。
以下是实现方法:
1、采用内部Comparable排序集合对象
(1) Comparable 排序接口,必须要实现接口并实现方法
class Studentmsg implements Comparable{ private int age; private String name; private int weight; private int tall; public Studentmsg(String name, int age, int tall, int weight) { this.age = age; this.name = name; this.weight = weight; this.tall = tall; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getWeight() { return weight; } public void setWeight(int weight) { this.weight = weight; } public int getTall() { return tall; } public void setTall(int tall) { this.tall = tall; } // 重写toString方法 拼接 @Override public String toString() { return "Studentmsg [name=" + name + ",age =" + age + ", weight=" + weight + ", tall=" + tall + "]"; } // 实现排序接口的方法 // this - o 从小到大 // o - this 从大到小 @Override public int compareTo(Studentmsg o) { // TODO Auto-generated method stub if (this.age == o.age) { if (this.weight == o.weight) { return o.tall - this.tall; } return o.weight - this.weight; } return o.age - this.age; } }
创建一个集合
Liststudent = new ArrayList (); student.add(new Studentmsg("小白", 20, 178, 70)); student.add(new Studentmsg("小李", 20, 176, 65)); student.add(new Studentmsg("小高", 20, 176, 70)); student.add(new Studentmsg("小智", 22, 169, 60)); student.add(new Studentmsg("小王", 19, 176, 71)); student.add(new Studentmsg("小黑", 23, 177, 73)); //接着可以直接通过Collections.sort来进行排序 Collections.sort(student) //排序规则从大到小
2、可以在内部的基础上改变排序规则,也就是采用外部Comparable排序集合
以下是实现代码(改变实现接口的排序规则:从小到大):
Collections.sort(student, new Comparator() { public int compare(Studentmsg o1, Studentmsg o2) { if (o1.getAge() == o2.getAge()) { if (o1.getWeight() == o2.getWeight()) { return o1.getTall() – o2.getTall(); } return o1.getWeight() – o2.getWeight(); } return o1.getAge() – o2.getAge(); } });
由于外部的排序规则优先度高,因此可以通过采用Comparator来改变别人的排序规则
二、 Comparator:是比较接口,我们如果需要控制某个类的次序,而该类本身不支持排序(即没有实现 Comparable接口),那么我们就可以建立一个“该类的比较器”来进行排序,这个“比较器”只需要实现 Comparator接口即可。也就是说,我们可以通过实现Comparator来新建一个比较器,然后通过这个比 较器对类进行排序。
注意:
- 若一个类要实现Comparator接口:它一定要实现compare(T o1, T o2) 函数,但可以不实现 equals(Object obj) 函数。
- int compare(T o1, T o2) 是“比较o1和o2的大小”。返回“负数”,意味着“o1比o2小”;返回“零”,意 味着“o1等于o2”;返回“正数”,意味着“o1大于o2”。
以下是实现方法:
*定义一个和上面一样的集合,但是不一样的是Studentmsg类不需要去实现排序接口
Comparator采用的是匿名内部类,所以一般用于在不能更改别人代码时使用(排序规则小到大)
class Studentmsg {
private int age;
private String name;
private int weight;
private int tall;
public Studentcomparator(String name, int age, int tall, int weight) {
this.age = age;
this.name = name;
this.weight = weight;
this.tall = tall;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getWeight() {
return weight;
}
public void setWeight(int weight) {
this.weight = weight;
}
public int getTall() {
return tall;
}
public void setTall(int tall) {
this.tall = tall;
}
// 重写toString方法 拼接
@Override
public String toString() {
return "Studentcomparator [name=" + name + ",age =" + age + ", weight=" + weight + ", tall=" + tall + "]";
}
}
排序规则从小到大:
Collections.sort(listStudentcomparator, new Comparator(){ public int compare(Studentcomparator o1, Studentcomparator o2) { if (o1.getAge() == o2.getAge()) { if (o1.getWeight() == o2.getWeight()) { return o1.getTall() - o2.getTall(); } return o1.getWeight() - o2.getWeight(); } return o1.getAge() - o2.getAge();}});
另外除了List集合可以使用排序接口,TreeSet因为也具有排序状态,因此也可以使用排序接口
Comparable和Comparator区别比较:
1、Comparable是排序接口,若一个类实现了Comparable接口,就意味着“该类支持排序”。 Comparator是比较器,我们若需要控制某个类的次序,可以建立一个“该类的比较器”来进行排序。 Comparable相当于“内部比较器”,而Comparator相当于“外部比较器”。
2、用Comparable简单, 只要实现Comparable 接口的对象直接就成为一个可以比较的对象,但是需 要修改源代码。 用Comparator 的好处是不需要修改源代码, 而是另外实现一个比较器, 当某个自定 义的对象需要作比较的时候,把比较器和对象一起传递过去就可以比大小了, 并且在Comparator 里面 用户可以自己实现复杂的可以通用的逻辑,使其可以匹配一些比较简单的对象,那样就可以节省很多重复劳动了。



