...的Comparator和Compa
文章分类:Java编程
java的Comparator和Comparable
当需要排序的集合或数组不是单纯的数字型时,通常可以使用Comparator或Comparable,以简单的方式真现对象排序或自定义排序。
一、Comparator
强行对某个对象collection进行团体排序的比较函数,可以将Comparator传递给Collections.sort或Arrays.sort。
接口方法:
/**
* @return o1小于、等于或大于o2,分别返回负整数、零或正整数。
*/
int compare(Object o1, Object o2);
案例:
import java.util.Arrays;
import java.util.Comparator;
public class SampleComparator implements Comparator<String> {
public int compare(String o1, String o2) {
return toInt(o1) - toInt(o2);
}
private int toInt(String str) {
str = str.replaceAll("一", "1");
str = str.replaceAll("二", "2");
str = str.replaceAll("三", "3");
return Integer.parseInt(str);
}
/**
* 测试方法
*/
public static void main(String[] args) {
String[] array = new String[] { "一二", "三", "二" };
Arrays.sort(array, new SampleComparator());
for (int i = 0; i < array.length; i++) {
System.out.println(array[i]);
}
}
}
&nb交通银行sp; 2、Comparable
强行对真现它的每一个类的对象进行团体排序,真现此接口的对象列表(和数组)可以通过Collections.sort或Arrays.sort进行自动排序。
接口方法:
/**
* @return 该对象小于、等于或大于指定对象o,分别返回负整数、零或正整数。
*/
int compareTo(Object o);
假设对象User,需要按年事排序:
public 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;
}
public int compareTo(User u) {
return this.age - u.getAge();
}
/**
* 测试方法
*/
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());
}
}
}
三、Comparator和Comparable的区别
先看一下使用Comparator对User集合真现排序的方式:一个类真现了Camparable接口则表明这个类的对象之间是可以互相比较的,这个类对象组成的集合就可以直接使用sort方法排序。
Comparator可以看成一种算法的真现,将算法和数据分离,Comparator也能够在下面两种环境下使用:
1、类的设计师没有考虑到比较问题而没有真现Comparable,可以通过Comparator来真现排序而不必改变对象本身
2、可以使用多种排序标准,比如升序、降序等
在TreeSet和TreeMap中添加的自定义对象必须真现Comparable接口
------------------------------------------------------------
关于援用数据类型的排序(自然排序和客户化排序):
1.对象本身真现Comparable接口,那么该类的真例就是可以排序的(真现其comparTo()方法).
只要真现了Comparable接口,就可以调用Collections的sort方法对集合中的元素排序.
2.真现Comparator接口的一个真例也能够真现排序功能.
看一下Comparator的全部内容:
public interface Comparator {
int compare(Object o1, Object o2);
boolean equals(Object obj);
}
定义了两个方法,我们一般都只需要真现compare方法。
为何呢?
因为所有自定义类默认extends Object,而Object中已经将equals()真现
Comparator一般都作为一个匿名类出现,对于没有真现Comparable的对象的集合,排序的时候
需要指定一个Comparator.
这里举例说明
对于真现了Comparable的类(自然排序)我们就用最简单的Integer
List list=new ArrayList();
list.add(new Integer(3));
list.add(new Integer(53));
list.add(new Integer(34));
Collections.sort(list);
对于没有真现Comparable的,我们就用Object,按照hashCode大小来排序.
List list= new ArrayList();
list.add(new Object());
list.add(new Object());
list.add(new Object());
Collections.sort(list,new Comparator(){ public int compare(Object o1, Object o2){
return (o1.hashCode()-o2.hashCode());
})
这里定义了一个排序规则,以匿名类的形式出现,当然你也能够定义一个自定义的类真现Comparator,
这样这个“排序规则”就能得以保存。
那Comparable 和 Comparator 接口有什么区别呢?
“口语文”的解释:用自定义类真现Comparable接口,那么这个类就具有排序功能,Comparable和具体你要进行排序的类的真例邦定。而Comparator比较灵活,它没有和任何类绑定,真现它的自定义类仅仅定义了一种排序方式或排序规则。不言而喻,这种方式比较灵活。我们的要排序的类可以分别和多个真现Comparator接口的类绑定,从而达到可以按自己的意愿真现按多种方式排序的目的。Comparable——“静态绑定排序”,Comparator——“动态绑定排序”。
...的Comparator和Compa相关推荐
- java8 Lambda表达式的应用(函数式接口、lambda表达式,方法引用及Stream API)
之前写了一篇博客简单介绍了一下java 8发布新增的一些特性功能,java 8在2014年发布,距今也不少年了,但是lambda表达式使用并不熟练,现在一边学习,一边记录一下. 目录 一.Lambda ...
- sort()排序(Comparable、Comparator)
在收集对象之后,对对象进行排序是常用的动作.不用亲自操作排序算法Java.util. Collections提供有sort()方法.由于必须有索引才能进行排序,因此 Collections的sort( ...
- 集合框架-Comparator和Comparable的区别
Comparator也叫外部比较器,常在使用Collections工具类进行集合排序的时候使用.外部比较器Comparator可以理解为一个专用的比较器,当集合中的对象不支持自比较或者比较的功能不能满 ...
- Comparator 和 Comparable
Comparator 和 Comparable 比较 Comparable是排序接口:若一个类实现了Comparable接口,就意味着"该类支持排序". 而Comparator是比 ...
- java 比较器comparator_Java中比较器的使用Compare和Comparator
Comparable和Comparator接口都是为了对类进行比较,众所周知,诸如Integer,double等基本数据类型,java可以对他们进行比较,而对于类的比较,需要人工定义比较用到的字段比较 ...
- Java 中 Comparable 和 Comparator 比较
为什么80%的码农都做不了架构师?>>> 本文,先介绍Comparable 和Comparator两个接口,以及它们的差异:接着,通过示例,对它们的使用方法进行说明. Comp ...
- Java 解惑:Comparable 和 Comparator 的区别
读完本文你将了解到: Comparable 自然排序 Comparator 定制排序 总结 Java 中为我们提供了两种比较机制:Comparable 和 Comparator,他们之间有什么区别呢? ...
- Comparable和Comparator使用区别
2019独角兽企业重金招聘Python工程师标准>>> 前段时间用到了Comparable,是把json串转换为list后排序,后来又写了一个通用方法来调用,然后就用到了Compar ...
- Java中比较对象的两个接口Comparable接口和Comparator接口
2019独角兽企业重金招聘Python工程师标准>>> jdk文档是这样介绍的 1. public interface Comparable<T>:此接口强行对实现它 ...
最新文章
- linux shell 产生随机数
- Select 标签可输入
- 学术写作利器——LaTeX入门笔记整理(不定期更新,附加使用心得)
- java从数组查找指定整数_如何在Java中使用重复项查找整数数组中的K个缺失数字?...
- 纯java应用搭建,16、BoneCp纯java项目使用
- Windows平台RTMP|RTSP播放器实现画面全屏功能
- ORACLE START WITH 语句的树级结构例子
- android的颜色渐变动画效果图,Android简单实现一个颜色渐变的ProgressBar
- mysql存储过程的一个小例子
- openfire源码解读--用户登录
- 全球编程厉害的14位大佬
- 关于跨团队合作的一些思考
- V4L2视频采集的基本流程
- 常用的表情和含义 各种笑脸;-)
- webstrom怎么配置git并提交
- Python实现学生成绩管理系统
- classnames库的简单使用
- 联想服务器RD450杨找不到raid选项,ThinkServer RD450服务器做RAID1
- 免格式化转换U盘格式
- Linux下安装mysql8.0.30
热门文章
- 程序中美元符号$是什么
- 用Git在阿里云下克隆时出现“Please make sure you have the correct access rights and the repository exists”错误
- HDP 2.6.5配置yarn的CGroups
- android 音量调节
- app开屏广告实现——借助webview和原生fetch请求实现
- C# 自定义控件,日期时间选择输入插件
- 天天向上的力量---python持续的力量
- 【Pyton安装】Python入门最详细的环境安装(附步骤),按照步骤点,几分钟就可以完成哦~
- Mac MySql官方下载速度太慢解决方案
- Xcode9中,添加图片素材无法显示的问题