自定义的类User:

package com.example.testcomparator;public class User{private String name;private int age;public User(String name, int age) {this.name = name;this.age = age;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String toString(){return "name:"+name+"--age:"+age;  }
}

当我们有一组User对象组合时,我们要对其中的User对象排序,优先对name排序,如果name一样,则再依据age排序。

1.使用Comparator接口来排序:

package com.example.testcomparator;import java.util.Comparator;//先比较id,再比较age
public class UserComparator implements Comparator<User>{@Overridepublic int compare(User user0, User user1) {// TODO Auto-generated method stubint flag = 0;flag = user0.getName().compareTo(user1.getName());if(flag == 0) { // 如果id一样,比较年龄, 返回比较年龄结果return user0.getAge() - user1.getAge();} else {return flag; // 名字不一样, 返回比较id的结果.}}}

排序方法,我们分别对List和数组来分别排序:

(1)List排序:

     List userList = new ArrayList<User>();userList.add(new User("a",5));userList.add(new User("c",6));userList.add(new User("a",4));userList.add(new User("b",2));userList.add(new User("b",3));userList.add(new User("c",7));       for(int i = 0;i<userList.size();i++){Log.i(TAG, "排序前:"+userList.get(i));}       Collections.sort(userList, new UserComparator());for(int i = 0;i<userList.size();i++){Log.i(TAG, "排序后:"+userList.get(i));}

(2)对数组排序:

     User[] userArray = new User[]{  new User("a", 5), new User("c", 6), new User("a", 4),                 new User("b", 2),new User("b", 3), new User("c", 7)};  for(int i = 0;i<userArray.length;i++){Log.i(TAG, "排序前:"+userArray[i]);}Arrays.sort(userArray,new UserComparator());for(int i = 0;i<userArray.length;i++){Log.i(TAG, "排序后:"+userArray[i]);}

输出结果:

排序前:name:a--age:5
排序前:name:c--age:6
排序前:name:a--age:4
排序前:name:b--age:2
排序前:name:b--age:3
排序前:name:c--age:7

排序后:name:a--age:4
排序后:name:a--age:5
排序后:name:b--age:2
排序后:name:b--age:3
排序后:name:c--age:6
排序后:name:c--age:7

2.使用Comparable接口来排序:

先要改造User类:

package com.example.testcomparator;public class User implements Comparable<Object>{private String name;private int age;public User(String name, int age) {this.name = name;this.age = age;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String toString(){return "name:"+name+"--age:"+age;  }  @Override//先比较id,id相同后再比较agepublic int compareTo(Object object) {// TODO Auto-generated method stubint flag = 0;flag = name.compareTo(((User)object).getName()); // 使用字符串的比较if(flag == 0) { // 如果id一样,比较年龄, 返回比较年龄结果return age - ((User)object).getAge();} else {return flag; // 名字不一样, 返回比较id的结果.}}
}

(1)List排序:

     List userList = new ArrayList<User>();userList.add(new User("a",5));userList.add(new User("c",6));userList.add(new User("a",4));userList.add(new User("b",2));userList.add(new User("b",3));userList.add(new User("c",7));       for(int i = 0;i<userList.size();i++){Log.i(TAG, "排序前:"+userList.get(i));}       Collections.sort(userList);for(int i = 0;i<userList.size();i++){Log.i(TAG, "排序后:"+userList.get(i));}

(2)对数组排序:

     User[] userArray = new User[]{  new User("a", 5), new User("c", 6), new User("a", 4),                 new User("b", 2),new User("b", 3), new User("c", 7)};  for(int i = 0;i<userArray.length;i++){Log.i(TAG, "排序前:"+userArray[i]);}Arrays.sort(userArray);for(int i = 0;i<userArray.length;i++){Log.i(TAG, "排序后:"+userArray[i]);}

输出结果:

排序前:name:a--age:5
排序前:name:c--age:6
排序前:name:a--age:4
排序前:name:b--age:2
排序前:name:b--age:3
排序前:name:c--age:7

排序后:name:a--age:4
排序后:name:a--age:5
排序后:name:b--age:2
排序后:name:b--age:3
排序后:name:c--age:6
排序后:name:c--age:7

3.总结:

comparable   Comparator 都是用来实现集合中的排序的。

Comparable是在集合内部定义的方法实现的排序,

Comparator是在集合外部实现的排序,

所以,如想实现排序,就需要在集合外定义Comparator接口的方法compare()或在集合内实现Comparable接口的方法compareTo()。

两种方法各有优劣:

用Comparable 简单, 只要实现Comparable 接口的对象直接就成为一个可以比较的对象,但是需要修改源代码。

用Comparator 的好处是不需要修改源代码, 而是另外实现一个比较器, 当某个自定义的对象需要作比较的时候,把比较器和对象一起传递过去就可以比大小了,

并且在Comparator 里面用户可以自己实现复杂的可以通用的逻辑,使其可以匹配一些比较简单的对象,那样就可以节省很多重复劳动了。

用 Comparator 是策略模式(strategy design pattern),就是不改变对象自身,而用一个策略对象(strategy object)来改变它的行为,所以,我们推荐使用Comparator.

4.参考资料:

1.Comparator和Comparable在排序中的应用

http://www.blogjava.net/fastunit/archive/2008/04/08/191533.html

2.Java中,如果想要排序,实现Comparator接口 //与Comparable 的区别?

http://zhidao.baidu.com/link?url=54BbyjAWPv5pG3l9c_ww0-4vPPdQSZ6FZ6u-yJAh52bJwXRRyTPN9iUUvpUYzKOMBLhl80Po2qfBI4Vipansh_

Java核心技术之Comparator和Comparable在排序中的应用相关推荐

  1. 结合自定义注解,java反射和comparator实现对象的排序

    开头一注:本代码是在学习comparator时,想到是否能写一个排序的工具类,在思考过后决定结合注解来实现排序,目前代码还比较粗犷,请大神指教,请大家轻喷. 一.新增自定义注解 @Documented ...

  2. android comparator,Comparator和Comparable实现排序的例子源码及其对比

    [Java] 纯文本查看 复制代码package object_sort; import java.text.ParseException; import java.text.SimpleDateFo ...

  3. Java核心技术基础知识学习之Java集合(三)

    文章目录 七.Java集合 7.6 Java 8 增强的 Map 集合 7.6.1 Java 8 中 Map 新增的方法 7.6.2 Java 8 改进的 HashMap 和 HashTable 实现 ...

  4. [Java开发之路](21)Comparator与Comparable

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/SunnyYoona/article/details/50889774 1. Comparable p ...

  5. java的Comparator和Comparable

    java的Comparator和Comparable 当需要排序的集合或数组不是单纯的数字型时,通常可以使用Comparator或Comparable,以简单的方式实现对象排序或自定义排序.      ...

  6. Java中Comparator和Comparable之间的区别

    常见的面试问题之一是"比较器和可比较器之间有什么区别". 或"您将如何通过其ID或名称对员工对象集合进行排序".为此,我们可以使用两个接口,即Comparato ...

  7. java实现什么接口进行排序_使用Java中Comparator接口实现自定义排序

    一般情况下,自己动手写一个简单排序程序还是没有问题的,但是你能保证写出来的排序程序的时间复杂度吗?你能保证程序的正确性吗,鲁棒性呢,还有程序结构的清晰性,可维护性.......综上所述,学习一下排序接 ...

  8. java comparable排序_java 实现Comparable接口排序,升序、降序、倒叙

    本人由于项目开发中需要对查询结果list进行排序,这里根据的是每一个对象中的创建时间降序排序.本人讲解不深,只实现目的,如需理解原理还需查阅更深的资料. 1.实现的效果 2.创建排序的对象 packa ...

  9. JAVA语言-比较器Comparator(java中Comparable和Comparator的区别)

    文章目录 一.什么是Comparator 二.Java compare方法和compareTo方法 三.java中Comparable和Comparator的区别 Comparator的例子 三.de ...

最新文章

  1. 完整项目基础架构精简版-实现权限管理
  2. Dependence Inversion Principle
  3. python datetime格式转换_分别用Excel和python进行日期格式转换成时间戳格式
  4. 根据创建时间搜索对应的BSP application
  5. 【RabbitMQ】 WorkQueues
  6. kaldi语音识别实战pdf_FSMN网络结构在语音识别声学模型的实践
  7. C语言转义字符介绍和示例
  8. 此页的状态信息无效,可能已损坏---应用程序中的服务器错误---
  9. Storm实验 -- 单词计数2
  10. MySQL报错: Access denied for user 'root'@'localhost'
  11. 流密码:lfsr(线性反馈移位寄存器)
  12. 科学计算机怎么算定积分,定积分计算方法的归纳和分析
  13. Jetson nano : PWM风扇调速。
  14. 家庭计算机上网必须用到的设备,家庭网络中常见的几种网络设备介绍
  15. opencart seo优化_opencart seo 优化技巧有哪一些
  16. [Lua基础]操作系统库——Date,Time,Clock
  17. java excel 密码,Java 加密、解密Excel文档
  18. 存储过程(无参,IN多个输入参数,OUT多个输出参数,INOUT输入输出)
  19. ContextCapture User Guide V4.4.11 Welcome(Smart3D 帮助文档 第一章 欢迎)
  20. JWT expired at 2022-04-07T12:06:46Z. Current time: 2022-04-10T19:47:24Z, a difference of 286838865..

热门文章

  1. Centos8修改mysql密码
  2. Python 打地鼠小游戏
  3. Packet(信息包)
  4. 【流程挖掘的四个质量维度】简单度、拟合度、精确度和泛化度介绍
  5. Python 表示无穷大的数
  6. 科研级试剂材料磷脂聚乙二醇马来酰亚胺 DSPE-PEG-MAL----为华生物
  7. iOS MVC设计模式
  8. hive sql 分组随机取数
  9. Java程序员学习Rust编程
  10. GO111MODULE作用