Java中Comparable和Comparator实现对象比较
注:文章转自ITEYE Peng的技术博客 有所改进和添加
当需要排序的集合或数组不是单纯的数字型时,通常可以使用Comparator或Comparable,以简单的方式实现对象排序或自定义排序。下面通过两个例子分别用Comparable和Comparator实现对User对象中年龄排序。
1.通过实现Comparable接口,根据User的年龄进行排序。
1 import java.util.Arrays; 2 3 /** 4 * @author pengcqu 5 * 6 */ 7 public class ComparableUser implements Comparable { //仅在实现比较的对象处添加实现接口代码 8 9 private String id; 10 private int age; 11 12 public ComparableUser(String id, int age) { 13 this.id = id; 14 this.age = age; 15 } 16 17 public int getAge() { 18 return age; 19 } 20 21 public void setAge(int age) { 22 this.age = age; 23 } 24 25 public String getId() { 26 return id; 27 } 28 29 public void setId(String id) { 30 this.id = id; 31 } 32 33 public int compareTo(Object o) { 34 return this.age - ((ComparableUser) o).getAge(); 35 } 36 37 /** 38 * 测试方法 39 */ 40 public static void main(String[] args) { 41 ComparableUser[] users = new ComparableUser[] { 42 new ComparableUser("u1001", 25), 43 new ComparableUser("u1002", 20), 44 new ComparableUser("u1003", 21) }; 45 Arrays.sort(users); //使用可比较对象(内部实现了比较方法) 46 for (int i = 0; i < users.length; i++) { 47 ComparableUser user = users[i]; 48 System.out.println(user.getId() + " " + user.getAge()); 49 } 50 } 51 52 }
2. 通过实现Comparator接口,根据User的年龄进行排序。
类实现compararor接口:
1 public class User { 2 3 private String id; 4 private int age; 5 6 public User(String id, int age) { 7 this.id = id; 8 this.age = age; 9 } 10 11 public int getAge() { 12 return age; 13 } 14 15 public void setAge(int age) { 16 this.age = age; 17 } 18 19 public String getId() { 20 return id; 21 } 22 23 public void setId(String id) { 24 this.id = id; 25 } 26 27 28 }
1 import java.util.Arrays; 2 import java.util.Comparator; 3 4 /** 5 * @author pengcqu 6 * 7 */ 8 public class UserComparator implements Comparator { //注意该处是类,当使用该comparator的时候要new一个对象才可使 9 10 public int compare(Object arg0, Object arg1) { 11 return ((User) arg0).getAge() - ((User) arg1).getAge(); 12 } 13 14 /** 15 * 测试方法 16 */ 17 public static void main(String[] args) { 18 User[] users = new User[] { new User("u1001", 25), 19 new User("u1002", 20), new User("u1003", 21) }; 20 Arrays.sort(users, new UserComparator()); //使用时候要new出comparator对象 21 for (int i = 0; i < users.length; i++) { 22 User user = users[i]; 23 System.out.println(user.getId() + " " + user.getAge()); 24 } 25 } 26 }
直接实现comparator:(使用的是另外一个例子)
1 private Comparator<ListNode> ListNodeComparator = new Comparator<ListNode>(){ 2 public int compare(ListNode left, ListNode right){ 3 //null is considered as infinite 4 if(left == null) 5 return 1; 6 else if(right == null) 7 return -1; 8 else 9 return left.val - right.val; 10 } 11 }; //注意一定要有“;”因为此句是实例化一个comparator实例,是一个语句。
使用时候直接使用该ListNodeComparator即可。
Queue<ListNode> heap = new PriorityQueue<ListNode>(lists.size(), ListNodeComparator);
选择Comparable接口还是Comparator?
一个类实现了Comparable接口则表明这个类的对象之间是可以相互比较的,这个类对象组成的集合就可以直接使用sort方法排序。
Comparator可以看成一种算法的实现,将算法和数据分离,Comparator也可以在下面两种环境下使用:
1、类的设计师没有考虑到比较问题而没有实现Comparable,可以通过Comparator来实现排序而不必改变对象本身
2、可以使用多种排序标准,比如升序、降序等。

浙公网安备 33010602011771号