import java.util.*;
/**
* @author 曹帅 E-mail:cslvln@foxmail.com
* @version 创建时间:2017/9/11 下午2:08
*/
public class User implements Comparable<User>{
private String name;
private int age;
public User() {
}
public User(String name, int age) {
this.name = name;
this.age = age;
}
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;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
@Override
public int compareTo(User o) {
int i = o.age - age;
if(i == 0){
return o.name.compareTo(name);
}
return i;
}
public static void main(String[] args) {
User user1 = new User("Jackie", 25);
User user2 = new User("Jim", 18);
User user3 = new User("Lucy", 30);
User user4 = new User("Kate", 18);
List<User> users = new ArrayList<User>();
users.add(user1);
users.add(user2);
users.add(user3);
users.add(user4);
System.out.println("排序前" );
for (User user : users) {
System.out.println(user.getName() + " " + user);
}
/**
* Java中不允许直接对自定义的对象调用sort直接排序,需要实现Comparable接口
* 两种方法实现自定义排序:
* 方法一:添加一个比较容器Comparator
* 方法二:自定义的Java对象实现Comparable接口
* (Java中的包装类和String都实现了Comparable接口了)
* 两种方法的区别(Comparable和Comparator的区别)
* 1.Comparable& Comparator 都是用来实现集合中的排序的,只是Comparable是在集合内部定义的方法实现的排序,Comparator是在集合外部实现的排序,所以,如想实现排序,就需要在集合外定义Comparator接口的方法compare()或在集合内实现Comparable接口的方法compareTo().
* 2.Comparable是一个对象本身就已经支持自比较所需要实现的接口(如String Integer自己就可以完成比较大小操作)
* 而Comparator是一个专用的比较器,当这个对象不支持自比较或者自比较函数不能满足你的要求时,你可以写一个比较器来完成两个对象之间大小的比较.
* 3.实现Comparable接口的方式比实现Comparator接口的耦合性 要强一些,如果要修改比较算法,要修改Comparable接口的实现类,而实现Comparator的类是在外部进行比较的,不需要对实现类有任何修改
*/
Collections.sort(users);
/*Collections.sort(users, new Comparator<User>() {
@Override
public int compare(User o1, User o2) {
int i = o1.getAge() - o2.getAge();
if(i == 0){
return o1.getName().compareTo(o2.getName());
}
return i;
}
});*/
System.out.println("排序后" );
for (User user : users) {
System.out.println(user.getName() + " " + user);
}
}
}