Java中的比较类/接口Comparator和Comparable的使用
Comparable & Comparator 都是用来实现集合中元素的比较、排序的 .
1.Comparable
Comparable 是一个对象本身就已经支持自比较所需要实现的接口(如 String、Integer 自己就可以完成比较大小操作,已经实现了Comparable接口)
2.Comparator
Comparator位于包java.util下 而Comparable位于包 java.lang下
只是 Comparable 是在集合内部定义的方法实现的排序,Comparator 是在集合外部实现排序的接口方法,
Comparable 是一个对象本身就已经支持自比较所需要实现的接口(如 String、Integer 自己就可以完成比较大小操作,已经实现了Comparable接口)
自定义的类要在加入List<T>容器中后能够排序,可以实现Comparable接口,在用Collections类的sort方法排序时,如果不指定Comparator,那么就以自然顺序排序,如API所说:
Sorts the specified list into ascending order, according to the natural ordering of its elements. All elements in the list must implement the Comparable interface
这里的自然顺序就是实现Comparable接口设定的排序方式。
而 Comparator 是一个专用的比较器,当这个对象不支持自比较或者自比较函数不能满足你的要求时,你可以写一个比较器来完成两个对象之间大小的比较。
可以说Comparable是自已完成比较,Comparator是外部程序实现比较的差别而已。
可参考:
http://ctzlylc.blog.163.com/blog/static/61967136201165981283/
http://my.oschina.net/leoson/blog/131904
http://merrygrass.iteye.com/blog/687597
http://www.aptusource.org/2014/05/object-ordering/
第一种使用Comparator接口 根据Collections.sort重载方法来实现
1 /** 2 * 根据order对User排序 */ 3 public class User { 4 //此处无需实现Comparable接口 5 private String name; 6 private Integer order; 7 public String getName() { 8 return name; 9 } 10 public void setName(String name) { 11 this.name = name; 12 } 13 public Integer getOrder() { 14 return order; 15 } 16 public void setOrder(Integer order) { 17 this.order = order; 18 } 19 } 20 24 public class Test{ 25 public static void main(String[] args) { 26 User user1 = new User(); 27 user1.setName("a"); 28 user1.setOrder(1); 29 User user2 = new User(); 30 user2.setName("b"); 31 user2.setOrder(2); 32 List<User> list = new ArrayList<User>(); 33 list.add(user2); 34 list.add(user1); 35 Collections.sort(list,new Comparator<User>(){ 36 public int compare(User user0, User user1) { 37 return user0.getOrder().compareTo(user1.getOrder()); 38 } 39 }); 40 for(User u : list){ 41 System.out.println(u.getName()); 42 } 43 } 44 }
第二种使用Comparable接口 list(集合对象)中的对象实现Comparable接口
1 /** 2 * 根据order对User排序 3 */ 4 public class User implements Comparable<User>{ 5 private String name; 6 private Integer order; 7 public String getName() { 8 return name; 9 } 10 public void setName(String name) { 11 this.name = name; 12 } 13 public Integer getOrder() { 14 return order; 15 } 16 public void setOrder(Integer order) { 17 this.order = order; 18 } 19 public int compareTo(User arg0) { 20 return this.getOrder().compareTo(arg0.getOrder()); 21 } 22 } 23 24 25 26 public class Test{ 27 public static void main(String[] args) { 28 User user1 = new User(); 29 user1.setName("a"); user1.setOrder(1); 30 User user2 = new User(); user2.setName("b"); 31 user2.setOrder(2); 32 List<User> list = new ArrayList<User>(); 33 //此处add user2再add user1 34 list.add(user2); list.add(user1); 35 Collections.sort(list); 36 for(User u : list){ 37 System.out.println(u.getName()); 38 } 39 } 40 }
作者:SummerChill 出处:http://www.cnblogs.com/DreamDrive/ 本博客为自己总结亦或在网上发现的技术博文的转载。 如果文中有什么错误,欢迎指出。以免更多的人被误导。 |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步