J2SE基础夯实系列之List中的数据如何根据对象的某一个或多个字段排序引出Comparable和comparator的使用
第一节 对于引入题目的探讨
首先把引入题目表述的清楚一些,在一个List中存储的是一些对象实例,而对象实例包含多个属性字段,我们要根据对象的某个或者多个属性来对List进行排序。
假设List中存储的都是Student类的实例,Student类包含name、gender、id属性。首先根据Student实例中的name属性排序,如果两个名字相同,就再根据id属性排序。
Student类源码如下:
[java]
<strong>package chapter1;
public class Student {
private String name;
private String gender;
private int id;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
}</strong>
假设有三个学生:
姓名 性别 ID
宋超 男 100120
伍星 男 100121
宋超 女 100122
把这三个学生存储在List里面,要求首先按照姓名进行排序,如果姓名相同就按照ID排序。
1.1.1第一种实现方式:使用Comparable接口;
使用这种方式时,Student类必须继承这个接口,并且实现compareTo方法。并且compareTo方法是这个接口的唯一方法。需要注意到一点,在《Effective Java》第十二条中,提供了一个通用的写法,也就是在类继承的Comparable接口的时候,利用泛型指明能比较的类型。把Student类改写如下:
[java]
package chapter1;
public classStudent implementsComparable<Student>{
private String name;
private String gender;
private int id;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getGender() {
return gender;
}
public void setGender(Stringgender) {
this.gender = gender;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
@Override
public int compareTo(Student arg0){
//String、Integer、Double、Float等类型都实现有compareTo方法
if(this.name.compareTo(arg0.name) == 0) {
return Integer.valueOf(id).compareTo(Integer.valueOf(arg0.id));
}else{
return this.name.compareTo(arg0.name);
}
}
}
在《Effective Java》中对于compareTo方法有以下几点提示:
·自反性
·传递性
·对称性
·最好和equals方法值相同
那么,在客户端调用的时候,直接写如下代码:
[java]
package chapter1;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class ClientInte易做图ce {
publicstatic void main(String[] args) {
Studentsongchao = new Student();
songchao.setGender("Man");
songchao.setId(100150);
songchao.setName("SongChao");
&
补充:软件开发 , Java ,