Java实现自定义对象的排序

来源:互联网 发布:linux 服务器 反应慢 编辑:程序博客网 时间:2024/05/18 02:49

下面是对自定义User对象排序的代码:

[java] view plain copy
  1. package com.jackie.java.base;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.Collections;  
  5. import java.util.List;  
  6.   
  7. public class JavaBase {  
  8.     public static void main(String[] args) {  
  9.         User user1 = new User("Jackie"25);  
  10.         User user2 = new User("Jim"18);  
  11.         User user3 = new User("Lucy"30);  
  12.         User user4 = new User("Kate"18);  
  13.   
  14. //        System.out.print(user1.compareTo(user2));  
  15.   
  16.         List<User> users = new ArrayList<>();  
  17.         users.add(user1);  
  18.         users.add(user2);  
  19.         users.add(user3);  
  20.         users.add(user4);  
  21.   
  22.         System.out.println("排序前" );  
  23.         for (User user : users) {  
  24.             System.out.println(user.getName() + " " + user);  
  25.         }  
  26.   
  27.         Collections.sort(users);  
  28.         System.out.println("排序后" );  
  29.         for (User user : users) {  
  30.             System.out.println(user.getName() + " " + user);  
  31.         }  
  32.     }  
  33. }  

出现了下面的异常:


很明显,Java中不允许直接对自定义的对象调用sort直接排序,需要实现Comparable接口。按照上面的方法改造一下User.java

方法一:让User对象实现Comparable接口

[java] view plain copy
  1. package com.jackie.java.base;  
  2.   
  3. /** 
  4.  * Created by Jackie on 2015/12/21. 
  5.  */  
  6. public class User implements Comparable<User> {  
  7.     private String name;  
  8.     private int age;  
  9.   
  10.     public User() {  
  11.     }  
  12.   
  13.     public User(String name, int age) {  
  14.         this.name = name;  
  15.         this.age = age;  
  16.     }  
  17.   
  18.     public String getName() {  
  19.         return name;  
  20.     }  
  21.   
  22.     public int getAge() {  
  23.         return age;  
  24.     }  
  25.   
  26.     public void setName(String name) {  
  27.         this.name = name;  
  28.     }  
  29.   
  30.     public void setAge(int age) {  
  31.         this.age = age;  
  32.     }  
  33.   
  34.   
  35.     @Override  
  36.     public int compareTo(User user) {  
  37.        return age - user.getAge();  
  38.     }  
  39. }  

调用方法:

Collections.sort(users);

方法二:User对象不作任何改动,添加一个比较器UserComparator.java

[java] view plain copy
  1. package com.jackie.java.base;  
  2.   
  3. import java.util.Comparator;  
  4.   
  5. /** 
  6.  * Created by Jackie on 2015/12/21. 
  7.  */  
  8. public class UserComparator implements Comparator {  
  9.     @Override  
  10.     public int compare(Object o1, Object o2) {  
  11.         User user1 = (User) o1;  
  12.         User user2 = (User) o2;  
  13.   
  14.         if (user1.getAge() > user2.getAge()) {  
  15.             return 1;  
  16.         } else if (user1.getAge() < user2.getAge()) {  
  17.             return -1;  
  18.         } else {  
  19.             //利用String自身的排序方法。  
  20.             //如果年龄相同就按名字进行排序  
  21.             return user1.getName().compareTo(user2.getName());  
  22.         }  
  23.     }  
  24. }  

调用方法:

Collections.sort(users, new UserComparator());

结果如下:

顺便说一下Comparable和Comparator的区别:

1. Comparable和Comparator都是用来实现集合中元素的比较、排序的,只是Comparable是在集合内部定义的方法实现的排序,Comparator是在集合外部实现的排序,所以想要实现排序,就需要在集合外定义Comparator接口或在集合内实现Comparable接口两种方法。

2. Comparable实现的排序只能是自然排序,这里的自然顺序就是实现Comparable接口设定的排序方式(Demo是按照年龄从小到大排序)。而Comparator是一个专用的比较器,当这个对象不支持自比较或者自比较函数不能满足你的要求时,你可以写一个比较器来完成两个对象之间大小的比较。比如说,如果把上面的UserComparator.java的方法改为:

[java] view plain copy
  1. public class UserComparator implements Comparator {  
  2.     @Override  
  3.     public int compare(Object o1, Object o2) {  
  4.         User user1 = (User) o1;  
  5.         User user2 = (User) o2;  
  6.   
  7.         if (user1.getAge() > user2.getAge()) {  
  8.             return -1;  
  9.         } else if (user1.getAge() < user2.getAge()) {  
  10.             return 1;  
  11.         } else {  
  12.             //利用String自身的排序方法。  
  13.             //如果年龄相同就按名字进行排序  
  14.             return user1.getName().compareTo(user2.getName());  
  15.         }  
  16.     }  
  17. }  
输出的结果则是倒序的(年龄从大到小)


可以说一个是自已完成比较,一个是外部程序(自定义比较规则)实现比较的差别而已。


原创粉丝点击