比较器:Comparable和Comparator
来源:互联网 发布:生态文明我知我行稿子 编辑:程序博客网 时间:2024/05/16 14:28
- 问题引入
我们会经常会对集合排序,如果该集合存储的数据具有自然排序功能,我们就会直接使用Collections.sort()方法直接进行排序。但是如果存储的数据没有自然排序的功能,我们就需要自定义比较器来实现对集合需求排序。自定义的排序有两种,分别使用Comparable和Comparator两个接口实现。
- 两种比较器的区别
第一:来源不同
Comparable属于java.lang包下的接口,而Comparator属于java.util包下的接口;
第二:重写的方法不同
Comparable重写compareTo(Object o)方法,而Comparator需要重写compare方法
第三:实现的位置不同
Comparable需要实现在比较对象的类上,而Comparator作为一个工具类自定义实现,经常使用匿名内部类来实现的。
- 比较器的实现-Comparable
//类实现的接口(Comparable)public class Person implements Comparable<Person>{ String name; int age; 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 Person(String name, int age) { this.name = name; this.age = age; } public Person(){} @Override public String toString() { return "Person [name=" + name + ", age=" + age + "]"; } /* 重写的方法 */ @Override public int compareTo(Person p) { if(this.age == p.age){ return 0; }else{ return this.age - p.age > 0 ? 1 : -1; } }}/* 测试小例*/public static void main(String[] args) { Person p1 = new Person("刘亮",26); Person p2 = new Person("白鸽",24); Person p3 = new Person("老冯",27); Person p4 = new Person("阿张",22); List<Person> list = new ArrayList<Person>(); list.add(p1); list.add(p2); list.add(p3); list.add(p4); System.out.println(list); Collections.sort(list); System.out.println("排序后-------------------------"); System.out.println(list); }}
- 比较器的实现-Comparator
public class CompareDemo { @SuppressWarnings("all") public static void main(String[] args) { Person p1 = new Person("刘亮",26); Person p2 = new Person("白鸽",24); Person p3 = new Person("老冯",27); Person p4 = new Person("阿张",22); List<Person> list = new ArrayList<Person>(); list.add(p1); list.add(p2); list.add(p3); list.add(p4); System.out.println(list); System.out.println("排序后-------------------------"); Collections.sort(list,new Comparator<Person>(){ @Override public int compare(Person p1, Person p2) { if(p1.age == p2.age){ return 0; }else{ return p1.age - p2.age > 0 ? 1 : -1; } }}); System.out.println(list); }}
- 运行结果
两种方法运行的结果相同:
[Person [name=刘亮, age=26], Person [name=白鸽, age=24], Person [name=老冯, age=27], Person [name=阿张, age=22]]
排序后————————————————————————————————-
[Person [name=阿张, age=22], Person [name=白鸽, age=24], Person [name=刘亮, age=26], Person [name=老冯, age=27]]
- 注意
两个中方法不要同时使用,以免发生冲头。只选用一种即可
- 汉字首字母的排序
汉字首字母的排序需要特殊的类,但是同样需要创建比较器(Comparator),这个类是Collator。该类已经实现了Comparator接口,只会执行区分语言环境的 String 比较。所以这个比较器只能比较字符串。
- 汉字排序小例
public class CompareDemo { public static void main(String[] args) { //这里传递的参数环境的语言类型,如果不传递参数表示默认的环境类型(系统环境) Comparator<Object> comparator = Collator.getInstance(Locale.CHINA); ArrayList<String> arrayList = new ArrayList<>(); arrayList.add("中国"); arrayList.add("陕西"); arrayList.add("武汉"); arrayList.add("瑞士"); System.out.println(arrayList); Collections.sort(arrayList, comparator); System.out.println("汉字首字母排序后--------------------------------------"); System.out.println(arrayList );}/* 运行结果: [中国, 陕西, 武汉, 瑞士] 汉字首字母排序后---------- [瑞士, 陕西, 武汉, 中国]*/
- 比较器Comparable和Comparator
- 比较器:Comparable和Comparator
- 比较Comparable和Comparator
- Comparator和Comparable比较
- comparable和comparator比较
- Comparable和Comparator比较
- Comparator 和 Comparable 比较
- Comparator 和 Comparable比较
- Comparator和Comparable比较
- comparable和comparator比较
- Comparable、Comparator比较器
- 比较器comparable和comparator的区别
- Java比较器-Comparable和Comparator
- Comparator比较器和Comparable接口
- Comparable和Comparator实例比较
- Comparable和Comparator的比较
- java比较:Comparable和Comparator
- Comparable和Comparator的比较
- POJ 1014 Dividing 已被翻译
- Mycat 基于MySQL master-slave 读写分离验证
- C++操作oracle数据库
- 顺序串基本操作
- 洛谷 1319_压缩技术_模拟
- 比较器:Comparable和Comparator
- shadowsocks and pac
- arp命令使用
- Retrofit实现图文上传至服务器
- JMeter常用测试元件
- UI框架的思考
- spark性能优化:数据倾斜调优
- AndroidStudio生成自己的Compile依赖
- jsp页面中jstl标签详解