Comparable使一个class具备不同实例间进行比较的行为。这些对象的集合,可作为Collections.sort或Arrays.sort的参数

Comparator可以看成一种算法的实现,将算法和数据分离。实现Comparator的可以作为Collections.sort或Arrays.sort的参数

都可以多条件排序。类似于order by field1,field2
都是接口

import java.util.Arrays;
import java.util.Comparator;public class UserComparator implements Comparator<User> {/**** @param source* @param target* @return 负数:升序;0:顺序不变;正数:降序*/@Overridepublic int compare(User source, User target) {int result = source.getAge() - target.getAge();System.out.println(result);return result;}public static void main(String[] args) {User[] users = new User[]{new User("a", 30), new User("b", 20)};Arrays.sort(users, new UserComparator());for (int i = 0; i < users.length; i++) {User user = users[i];System.out.println(user.getId() + " " + user.getAge());}}
}class User {private String id;private int age;public User(String id, int age) {this.id = id;this.age = age;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getId() {return id;}public void setId(String id) {this.id = id;}}

import java.util.Arrays;public class User implements Comparable<User> {private String id;private int age;public User(String id, int age) {this.id = id;this.age = age;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getId() {return id;}public void setId(String id) {this.id = id;}@Overridepublic int compareTo(User target) {int result = this.age - target.getAge();System.out.println(result);return result;}public static void main(String[] args) {User[] users = new User[]{new User("a", 30), new User("b", 20)};Arrays.sort(users);for (int i = 0; i < users.length; i++) {User user = users[i];System.out.println(user.getId() + " " + user.getAge());}}
}

实例如下:

class Student implements Comparable<Student>{private String name;private int age;private float score;public Student(String name, int age, float score) {this.name = name;this.age = age;this.score = score;}public String toString(){return name+"\t\t"+age+"\t\t"+score;}@Overridepublic int compareTo(Student o) {// TODO Auto-generated method stubif(this.score>o.score)//score是private的,为什么能够直接调用,这是因为在Student类内部return -1;//由高到底排序else if(this.score<o.score)return 1;else{if(this.age>o.age)return 1;//由底到高排序else if(this.age<o.age)return -1;elsereturn 0;}}
}public class ComparableDemo01 {/*** @param args*/public static void main(String[] args) {// TODO Auto-generated method stubStudent stu[]={new Student("zhangsan",20,90.0f),new Student("lisi",22,90.0f),new Student("wangwu",20,99.0f),new Student("sunliu",22,100.0f)};java.util.Arrays.sort(stu);for(Student s:stu){System.out.println(s);}}
}

程序运行结果:

sunliu 22 100.0
wangwu 20 99.0
zhangsan 20 90.0
lisi 22 90.0

但是在设计类的时候,往往没有考虑到让类实现Comparable接口,那么我们就需要用到另外的一个比较器接口Comparator。

从上面的实例我们可以发现,compareTo(T o)只有一个参数,而Comparator接口中必须要实现的compare(T o1,T o2)就有两个参数。

package edu.sjtu.ist.comutil;import java.util.Comparator;class Student {private String name;private int age;private float score;public Student(String name, int age, float score) {this.name = name;this.age = age;this.score = score;}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;}public float getScore() {return score;}public void setScore(float score) {this.score = score;}public String toString(){return name+"\t\t"+age+"\t\t"+score;}}class StudentComparator implements Comparator<Student>{@Overridepublic int compare(Student o1, Student o2) {// TODO Auto-generated method stubif(o1.getScore()>o2.getScore())return -1;else if(o1.getScore()<o2.getScore())return 1;else{if(o1.getAge()>o2.getAge())return 1;else if(o1.getAge()<o2.getAge())return -1;else return 0;}}}public class ComparableDemo02 {/*** @param args*/public static void main(String[] args) {// TODO Auto-generated method stub
Student stu[]={new Student("zhangsan",20,90.0f),new Student("lisi",22,90.0f),new Student("wangwu",20,99.0f),new Student("sunliu",22,100.0f)};java.util.Arrays.sort(stu,new StudentComparator());for(Student s:stu){System.out.println(s);}}}

上述程序的运行结果与代码实例1一样。

转载于:https://www.cnblogs.com/softidea/p/3760921.html

java Comparable和Comaprator的对比相关推荐

  1. Java创建comparator对象,Java Comparable 和 Comparator 的详解及区别

    Java Comparable 和 Comparator 的详解及区别 Java 中为我们提供了两种比较机制:Comparable 和 Comparator,他们之间有什么区别呢?今天来了解一下. C ...

  2. Java Comparable接口的陷阱

    Java Comparable接口提供了一种对实现该接口的类进行自然排序的方法. 自然顺序对标量和其他非常简单的对象有意义,但是当我们使用面向业务的领域对象时,自然顺序就变得更加复杂. 从业务经理的角 ...

  3. C++函数与java函数菜鸟级的对比理解

    C++函数与java函数菜鸟级的对比理解 转自:http://blog.csdn.net/stevenhu_223/article/details/9108571 Android源码底层的代码实现文件 ...

  4. php java优劣_PHP开发和JAVA开发网站的优劣对比

    PHP开发和JAVA开发网站的优劣对比有哪些?该篇文章由川软教育君整理并编辑: 1.开发网站最好选用一个比较成熟.资料比较多的CMS,因为自己开发后台工作量也不小,JAVA的CMS比PHP要少很多,所 ...

  5. Java锁的升级与对比

    Java锁的升级与对比 在Java SE 1.6中,锁一共有4种状态,级别从低到高依次是:无锁状态.偏向锁状态.轻量级锁状态和重量级锁状态,这几个状态会随着竞争情况逐渐升级. 注: 锁可以升级但不能降 ...

  6. Java Comparable的使用

    这是啥? Comparable是个接口,是一个内部比较器,通常在类定义的时候实现Comparable接口,重写compareTo方法实现排序 怎么用? 与另一篇博客的例子类似,先创建一个lol英雄类H ...

  7. java comparable 泛型_Java泛型的应用——T extends Comparable? super T

    在观察Java源码的时候,发现了这么一个写法T extends Comparable super T>.不禁纳闷为什么要这么写呢?有什么好处吗,extends和super在这里的作用着实让人有点 ...

  8. java comparable接口作用_Java 中 Comparable 接口的意义和用法

    一, 为何需要实现Comparable接口 我们知道Collections类中包含很多对实现Collection接口的容器各种操作的静态方法. 当然, 其中最长用的莫过于排序了(Collections ...

  9. Java VS .NET:Java与.NET的特点对比

    一.前言 为什么要写Java跟.NET对比? .NET出生之后就带着Java的影子.从模仿到创新,.NET平台也越来越成熟.他们不同的支持者也经常因为孰弱孰强的问题争论不休.但是本文并不是为了一分高下 ...

最新文章

  1. 深入剖析iLBC的丢包补偿技术(PLC)
  2. P2340 奶牛会展(状压dp)
  3. java异常体系分类(面试)
  4. android pick file,LFilePicker---文件选择利器,各种样式有它就够了
  5. 在大流行的世界中如何建立技术社区
  6. 大数据项目之dmp用户画像
  7. 机试:Python的代码模板、OJ技巧
  8. 世平数据库保密检查工具再次荣膺中国“优秀软件产品”称号
  9. 中国单箱梁体最宽矮塔斜拉桥合龙
  10. 【基本办公软件】万彩办公大师教程丨彩色转化PDF为黑白PDF
  11. Java 关键字及其作用(保留字)
  12. 能量,功率,能量谱和功率谱密度
  13. sqlserver 汉字转拼音(转载)
  14. java调用opencc将中文简体繁体转换
  15. 博仲兴业力作——《爱的雨季》讲述爱情的奥秘
  16. 加拿大 oracle audio,来自加拿大的“简单”与“纯粹”——Verity Audio Otello座地式扬声器...
  17. 高等数学 下册 第九章 平面及空间点集 笔记
  18. java mavlink_java – 使用消息更改速度到Mavlink
  19. N沟道增强型MOS管原理
  20. 钢筋直螺纹套筒A钢筋直螺纹套筒A钢筋直螺纹连接丝扣加工要求

热门文章

  1. 谷歌修复已遭利用的 Chrome 0day
  2. ImmuniWeb 推出暗网数据泄露免费查询工具,使用超简单
  3. 互联网公司面试必问的mysql题目(上)
  4. 星云链智能合约开发(六):智能合约开发与部署
  5. windows测试模式
  6. 图形图像处理,CAD控件Simulation and Verification提供模拟机器的工具运转机床和车床材料的搬运控件...
  7. android连接指定的wifi
  8. 【转】卡巴斯基安全公告称甲骨文数据库存在加密漏洞
  9. 请还未提交实名的博客专家在8月4日前尽快提交您的实名信息
  10. Linux服务器上无法保存修改的文件