java Comparable和Comaprator的对比
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的对比相关推荐
- Java创建comparator对象,Java Comparable 和 Comparator 的详解及区别
Java Comparable 和 Comparator 的详解及区别 Java 中为我们提供了两种比较机制:Comparable 和 Comparator,他们之间有什么区别呢?今天来了解一下. C ...
- Java Comparable接口的陷阱
Java Comparable接口提供了一种对实现该接口的类进行自然排序的方法. 自然顺序对标量和其他非常简单的对象有意义,但是当我们使用面向业务的领域对象时,自然顺序就变得更加复杂. 从业务经理的角 ...
- C++函数与java函数菜鸟级的对比理解
C++函数与java函数菜鸟级的对比理解 转自:http://blog.csdn.net/stevenhu_223/article/details/9108571 Android源码底层的代码实现文件 ...
- php java优劣_PHP开发和JAVA开发网站的优劣对比
PHP开发和JAVA开发网站的优劣对比有哪些?该篇文章由川软教育君整理并编辑: 1.开发网站最好选用一个比较成熟.资料比较多的CMS,因为自己开发后台工作量也不小,JAVA的CMS比PHP要少很多,所 ...
- Java锁的升级与对比
Java锁的升级与对比 在Java SE 1.6中,锁一共有4种状态,级别从低到高依次是:无锁状态.偏向锁状态.轻量级锁状态和重量级锁状态,这几个状态会随着竞争情况逐渐升级. 注: 锁可以升级但不能降 ...
- Java Comparable的使用
这是啥? Comparable是个接口,是一个内部比较器,通常在类定义的时候实现Comparable接口,重写compareTo方法实现排序 怎么用? 与另一篇博客的例子类似,先创建一个lol英雄类H ...
- java comparable 泛型_Java泛型的应用——T extends Comparable? super T
在观察Java源码的时候,发现了这么一个写法T extends Comparable super T>.不禁纳闷为什么要这么写呢?有什么好处吗,extends和super在这里的作用着实让人有点 ...
- java comparable接口作用_Java 中 Comparable 接口的意义和用法
一, 为何需要实现Comparable接口 我们知道Collections类中包含很多对实现Collection接口的容器各种操作的静态方法. 当然, 其中最长用的莫过于排序了(Collections ...
- Java VS .NET:Java与.NET的特点对比
一.前言 为什么要写Java跟.NET对比? .NET出生之后就带着Java的影子.从模仿到创新,.NET平台也越来越成熟.他们不同的支持者也经常因为孰弱孰强的问题争论不休.但是本文并不是为了一分高下 ...
最新文章
- 深入剖析iLBC的丢包补偿技术(PLC)
- P2340 奶牛会展(状压dp)
- java异常体系分类(面试)
- android pick file,LFilePicker---文件选择利器,各种样式有它就够了
- 在大流行的世界中如何建立技术社区
- 大数据项目之dmp用户画像
- 机试:Python的代码模板、OJ技巧
- 世平数据库保密检查工具再次荣膺中国“优秀软件产品”称号
- 中国单箱梁体最宽矮塔斜拉桥合龙
- 【基本办公软件】万彩办公大师教程丨彩色转化PDF为黑白PDF
- Java 关键字及其作用(保留字)
- 能量,功率,能量谱和功率谱密度
- sqlserver 汉字转拼音(转载)
- java调用opencc将中文简体繁体转换
- 博仲兴业力作——《爱的雨季》讲述爱情的奥秘
- 加拿大 oracle audio,来自加拿大的“简单”与“纯粹”——Verity Audio Otello座地式扬声器...
- 高等数学 下册 第九章 平面及空间点集 笔记
- java mavlink_java – 使用消息更改速度到Mavlink
- N沟道增强型MOS管原理
- 钢筋直螺纹套筒A钢筋直螺纹套筒A钢筋直螺纹连接丝扣加工要求
热门文章
- 谷歌修复已遭利用的 Chrome 0day
- ImmuniWeb 推出暗网数据泄露免费查询工具,使用超简单
- 互联网公司面试必问的mysql题目(上)
- 星云链智能合约开发(六):智能合约开发与部署
- windows测试模式
- 图形图像处理,CAD控件Simulation and Verification提供模拟机器的工具运转机床和车床材料的搬运控件...
- android连接指定的wifi
- 【转】卡巴斯基安全公告称甲骨文数据库存在加密漏洞
- 请还未提交实名的博客专家在8月4日前尽快提交您的实名信息
- Linux服务器上无法保存修改的文件