Comparable接口和Comparator接口
1、一个类在设计之初就要实现对该类对象的排序功能,那么这个类要实现Comparable接口,实现public int compareTo(T t)方法。如代码中的Student类。
对于实现Comparable接口的类,
调用java.util.Arrays.sort(Object[] a)对包含对象实例的数组进行排序,
调用java.util.Collections.sort(List<T> list)对包含对象实例的list进行排序。
2、若一个类在设计之初并没有对排序功能的需求,而是在后续的使用中想要对这个类添加排序的功能,如Teacher类。这时的办法是实现一个比较器类,
如TeacherComparator类,实现public int compare(T t1, T t2)让该类实现Comparator接口。
调用java.util.Arrays.sort(T[] a, Comparator<? super T> c) 对包含对象实例的数组进行排序,
调用java.util.Collections.sort(List<T> list, Comparator<? super T> c) 对包含对象实例的list进行排序。
3、a.compareTo(b)方法和compare(a,b)方法,在方法中判断两个对象的某个或某些属性的大小关系,若a的某个属性比b的属性小,返回负整数,若相等,返回0,否则返回正整数。
if a.attr < b.attr
return -1
else
return 1
上面即为按照某属性从小到大排序。
if a.attr < b.attr
return 1
else
return -1
上面为按照某属性从大到小排序。
以下代码按照Score从高到底排序,若Score相同,则按照age从小到大排序。
public class Student implements Comparable<Student>{
private String name;
private int id;
private int score;
private int age;
public Student(String name, int id, int score, int age) {
super();
this.name = name;
this.id = id;
this.score = score;
this.age = age;
}
@Override
public int compareTo(Student s) {
if (this.score < s.getScore()) {
return 1;
} else if (this.score > s.getScore()) {
return -1;
} else {
if (this.age < s.getAge()) {
return -1;
} else {
return 1;
}
}
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int getScore() {
return score;
}
public void setScore(int score) {
this.score = score;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public static void main(String[] args) {
System.out.println("use Interface Comparable");
System.out.println();
System.out.println("Array ");
System.out.println();
Student[] stu = {new Student("a", 1, 88, 18),
new Student("b", 2, 78, 16),
new Student("c", 3, 88, 17),
new Student("d", 4, 78, 16),
new Student("e", 5, 100, 18)};
Arrays.sort(stu);
for (Student s : stu) {
System.out.println(s.getScore() + " " + s.getAge());
}
System.out.println("***");
System.out.println("List");
System.out.println();
List<Student> list = new ArrayList<Student>();
list.add(new Student("a", 1, 88, 18));
list.add(new Student("b", 2, 78, 16));
list.add(new Student("c", 3, 88, 17));
list.add(new Student("d", 4, 78, 16));
list.add(new Student("e", 5, 100, 18));
Collections.sort(list);
for (Student s : list) {
System.out.println(s.getScore() + " " + s.getAge());
}
System.out.println();
System.out.println("use Interface Comparator");
System.out.println();
System.out.println("Array");
System.out.println();
Teacher[] teach = {
new Teacher("a", 1, 88, 18),
new Teacher("b", 2, 78, 16),
new Teacher("c", 3, 88, 17),
new Teacher("d", 4, 78, 16),
new Teacher("e", 5, 100, 18)};
Arrays.sort(teach, new TeacherComparator());
for (Teacher t : teach) {
System.out.println(t.getScore() + " " + t.getAge());
}
System.out.println();
System.out.println("List");
System.out.println();
List<Teacher> tList = new ArrayList<Teacher>();
tList.add(new Teacher("a", 1, 88, 18));
tList.add(new Teacher("b", 2, 78, 16));
tList.add(new Teacher("c", 3, 88, 17));
tList.add(new Teacher("d", 4, 78, 16));
tList.add(new Teacher("e", 5, 100, 18));
Collections.sort(tList, new TeacherComparator());
for (Teacher t : tList) {
System.out.println(t.getScore() + " " + t.getAge());
}
}
}
class Teacher {
private String name;
private int id;
private int score;
private int age;
public Teacher(String name, int id, int score, int age) {
super();
this.name = name;
this.id = id;
this.score = score;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int getScore() {
return score;
}
public void setScore(int score) {
this.score = score;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
class TeacherComparator implements Comparator<Teacher> {
@Override
public int compare(Teacher t1, Teacher t2) {
if (t1.getScore() < t2.getScore()) {
return 1;
} else if (t1.getScore() > t2.getScore()) {
return -1;
} else {
if (t1.getAge() < t2.getAge()) {
return -1;
} else {
return 1;
}
}
}
}
Comparable接口和Comparator接口的更多相关文章
- Java中实现对象的比较:Comparable接口和Comparator接口
在实际应用中,我们往往有需要比较两个自定义对象大小的地方.而这些自定义对象的比较,就不像简单的整型数据那么简单,它们往往包含有许多的属性,我们一般都是根据这些属性对自定义对象进行比较的.所以Java中 ...
- Java6.0中Comparable接口与Comparator接口详解
Java6.0中Comparable接口与Comparator接口详解 说到现在,读者应该对Comparable接口有了大概的了解,但是为什么又要有一个Comparator接口呢?难道Java的开发者 ...
- Java:实现对象的比较 comparable接口和comparator接口
在实际应用中,我们往往有需要比较两个自定义对象大小的地方.而这些自定义对象的比较,就不像简单的整型数据那么简单,它们往往包含有许多的属性,我们一般都是根据这些属性对自定义对象进行比较的.所以Java中 ...
- Java—集合框架 Collections.sort()、Comparable接口和Comparator接口
Collentions工具类--java.util.Collections Collentions是Java集合框架中,用来操作集合对象的工具类,也是Java集合框架的成员,与List.Map和Set ...
- Comparable接口与Comparator接口的比较————总结
之前的两篇文章主要学习了Comparable接口和Comparator接口的学习.既然已经学习完了,现在就趁热打铁,进行总结吧! Comparable接口和Comparator接口的共同点: 1. 都 ...
- 比较器:Compare接口与Comparator接口区别与理解
一.实现Compare接口与Comparator接口的类,都是为了对象实例数组排序的方便,因为可以直接调用 java.util.Arrays.sort(对象数组名称),可以自定义排序规则. 不同之处: ...
- java中Comparatable接口和Comparator接口的区别
1.不同类型的排序规则 .自然排序是什么? 自然排序是一种升序排序.对于不同的数据类型,升序规则不一样: BigDecimal BigInteger Byte Double Float Int ...
- Comparatable接口和Comparator接口的使用与区别
这篇博文可以为你解决的问题如下: 什么是自然排序 Collections.sort()与Arrays.sort()的异同点 Comparatable接口和Comparator接口各自的排序依据(理论讲 ...
- Java中的Comparable接口和Comparator接口
Comparator位于包java.util下,比较器,是在集合外部定义排序.Comparable位于包java.lang下,代表当前对象可比较的,是在集合内部实现排序. Comparable代表一个 ...
- Java之Comparable接口和Comparator接口
Comparable & Comparator 都是用来实现集合中元素的比较.排序的: Comparable 是在集合内部定义的方法实现的排序: Comparator 是在集合外部实现的排序: ...
随机推荐
- Linux显示本地端的文件系统
Linux显示本地端的文件系统 youhaidong@youhaidong-ThinkPad-Edge-E545:~$ df -l 文件系统 1K-blocks 已用 可用 已用% 挂载点 /dev/ ...
- Duplicate <http> element detected
1.错误描述 org.springframework.beans.factory.parsing.BeanDefinitionParsingException:Configuration pro ...
- 加深try catch Finnly的理解
上代码 public String twoGetFeeInfoByWithUnit(JSONArray jsonArray,String key1,String key2){ String Debit ...
- mybatis的动态增删改查
1.动态SQL片段 通过SQL片段达到代码复用 <!-- 动态条件分页查询 --> <sql id="sql_count"> select count(*) ...
- SonarQube和Maven的集成
1.1. SonarQube简介 SonarQube是一款免费用于代码质量管理的开源平台,用于管理源代码的质量,可以从七个维度检测代码质量通过插件形式,可以支持包括java,C#,C/C++,PL/S ...
- 【BZOJ3262】陌上花开(CDQ分治)
[BZOJ3262]陌上花开(CDQ分治) 题解 原来放过这道题目,题面在这里 树套树的做法也请点上面 这回用CDQ分治做的 其实也很简单, 对于第一维排序之后 显然只有前面的对后面的才会产生贡献 那 ...
- [SDOI2015]约数个数和
Sol 首先有个结论 \(\sum_{i=1}^{m}\sum_{j=1}^{n}d(i*j)=\sum_{i=1}^{m}\sum_{j=1}^{n}\sum_{x|i}\sum_{y|i}[gcd ...
- C# Redis实战(一)
一.初步准备 Redis 是一个开源的使用ANSI C 语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value 数据库.Redis的出现,很大程度补偿了memcached这类key/va ...
- windows下的react-native 开发环境搭建
本教程用安卓手机作为演示. 首先安装jdk.本教程基于jdk1.8,安装时有一点要特别注意:jdk和jre必须装到不同目录下,否则初始化react-native项目时大概率报tools.jar not ...
- select函数的介绍和使用
我们所使用的I/O模型一共有五种. 分别为阻塞I/O,非阻塞I/O,I/O复用,信号驱动I/O,异步I/O. 所谓I/O复用就是指管理多个I/O文件描述符,一般会使用(select,poll,epol ...