java.lang.Comparable 跟java.util.Comparator
一个类实现了java.lang.Comparable接口表明这个类的对象之间是可以进行相互比较的,这个类对象组成的集合就可以直接使用Collections.sort()方法排序。
java.util.Comparator可看成是算法的实现,将算法和数据分离,可在以下两种环境下使用:
1.类的设计师没有考虑到比较问题而没有实现Comparable接口,可以通过Comparator排序而不用改变对象本身
2.可以使用多种排序标准,升序,降序
第一种方法:实现java.lang.Comparator接口进行排序
public class User implements Comparable{
private String name;
private int age;
private String address;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public int compareTo(Object o) {
// TODO Auto-generated method stub
User user = (User)o;
if (age > user.getAge()){
return 1;
} else if (age == user.getAge()){
return 0;
} else {
return -1;
}
}
}
public class ComparableTest {
@SuppressWarnings("unchecked")
@Test
public void comparable(){
List<User> userList = new ArrayList<User>();
User user = new User();
user.setAddress("北京");
user.setAge(15);
user.setName("张三");
userList.add(user);
user = new User();
user.setAddress("上海");
user.setAge(25);
user.setName("李四");
userList.add(user);
user = new User();
user.setAddress("广州");
user.setAge(18);
user.setName("王五");
userList.add(user);
user = new User();
user.setAddress("香港");
user.setAge(35);
user.setName("马六");
userList.add(user);
Collections.sort(userList);
for (User u:userList){
System.out.println(u.getAge()+","+u.getName()+","+u.getAddress());
}
}
}
第二种方法: 定义比较算法,实现java.util.Comparator接口
public class User {
private String name;
private int age;
private String address;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
public class NewComparator implements Comparator<User>{
public int compare(User user1, User user2) {
// TODO Auto-generated method stub
if (user1.getAge() > user2.getAge()){
return 1;
} else if (user1.getAge() == user2.getAge()){
return 0;
} else {
return -1;
}
}
}
public class ComparatorTest {
@SuppressWarnings("unchecked")
@Test
public void comparatorTest(){
List<User> userList = new ArrayList<User>();
User user = new User();
user.setAddress("北京");
user.setAge(15);
user.setName("张三");
userList.add(user);
user = new User();
user.setAddress("上海");
user.setAge(25);
user.setName("李四");
userList.add(user);
user = new User();
user.setAddress("广州");
user.setAge(18);
user.setName("王五");
userList.add(user);
user = new User();
user.setAddress("香港");
user.setAge(35);
user.setName("马六");
userList.add(user);
Collections.sort(userList,new NewComparator());
for (User u:userList){
System.out.println(u.getAge()+","+u.getName()+","+u.getAddress());
}
}
}