Java ArrayList中对象的排序 (Comparable VS Comparator)
我们通常使用Collections.sort()方法来对一个简单的数据列表排序。但是当ArrayList是由自定义对象组成的,就需要使用comparable或者comparator接口了。在使用这两者进行排序之前,先尝试不实现任何接口来进行排序。
考虑下面的例子——有一个Student类,具有三个属性:name, rollno, age
public class Student {
private String name;
private int rollno;
private int age;
/* 有参构造 ...*/
/* getter and setter ...*/
}
然后需要一个Student组成的ArrayList:
import java.util.*;
public class ArrayListSorting { public static void main(String args[]){
ArrayList<Student> arraylist = new ArrayList<Student>();
arraylist.add(new Student(223, "Chaitanya", 26));
arraylist.add(new Student(245, "Rahul", 24));
arraylist.add(new Student(209, "Ajeet", 32)); Collections.sort(arraylist); for(Student str: arraylist){
System.out.println(str);
}
}
}
这里尝试去调用Collections.sort()方法,但是出错了:
Exception in thread “main” java.lang.Error: Unresolved compilation problem:
Bound mismatch: The generic method sort(List) of type Collections is not applicable for the arguments (ArrayList). The inferred type Student is not a valid substitute for the bounded parameter > at beginnersbook.com.Details.main(Details.java:11)
原因:对于排序的ArrayList,除非其中元素实现了Comparable或者Comparator接口,否则不能调用Collections.sort方法。
使用Comparable对ArrayList<Object>进行排序
我们想要根据age对Student进行排序——实现Comparable接口,重写compareTo方法。
package beginnersbook.com;
public class Student implements Comparable {
private String name;
private int rollno;
private int age;
/* 有参构造 */
...
//getter and setter methods
...
@Override
public int compareTo(Student comparestu) {
int compareAge=((Student)comparestu).getAge();
/* 正序排列 */
return this.age-compareAge;
/* 逆序排列 */
//return compareAge-this.age;
}
@Override
public String toString() {
return "[ rollno=" + rollno + ", name=" + name + ", age=" + age + "]";
}
}
现在我们可以正常调用Collections.sort方法了。
既然Comparable完成了我们的工作,为什么还需要Comparator呢?
使用Comparable接口我们只能根据一个属性对ArrayList进行排序。为了让排序可以根据多个属性进行,需要使用Comparator。
使用Comparator对ArrayList<Object>进行排序(多个属性)
重写Comparator的compare方法:
import java.util.Comparator;
public class Student {
private String name;
private int rollno;
private int age; /* 有参构造 */
...
//Getter and setter methods
...
/* 根据name进行排序 */
public static Comparator<Student> NameComparator = new Comparator<Student>() { public int compare(Student s1, Student s2) {
String name1 = s1.getName().toUpperCase();
String name2 = s2.getName().toUpperCase(); // 正序排列
return StudentName1.compareTo(StudentName2); // 逆序排列
//return StudentName2.compareTo(StudentName1);
}}; /* 根据rollno进行排序 */
public static Comparator<Student> StuRollno = new Comparator<Student>() { public int compare(Student s1, Student s2) { int rollno1 = s1.getRollno();
int rollno2 = s2.getRollno(); /* 正序排列 */
return rollno1-rollno2; /* 逆序排列 */
//return rollno2-rollno1;
}};
@Override
public String toString() {
return "[ rollno=" + rollno + ", name=" + name + ", age=" + age + "]";
} }
这样,我们就既可以用name进行排序,也可以用age进行排序,只需要在有不同的排序需求时,使用不同的Comparator就可以了(e.g. Collections.sort(arraylist, Student.NameComparator))。
——以上内容译自Java ArrayList of Object Sort Example (Comparable And Comparator)
多属性组合排序
上面对Java的ArrayList自定义排序进行了基本介绍,下面是工作中遇到的一个需求:
对于一个漏洞,有两个排序依据,首先根据是否修复来排序,其次按照严重程度排序,类似于SQL中的ORDER BY field1, field2,若field1相同,则比较field2

可以看到,右边的一列是按照未修复,已修复的顺序排列的,而左边也是按照风险程度由高到低排列,但是分别对应了是否修复的顺序。这种排序可以认为也是多属性排序,但是与上边讲到的多属性不同,这种方式是多种属性结合的排序方式,
public static Comparator<Loopholes> loopholesComparator = new Comparator<Loopholes>() {
@Override
public int compare(Loopholes l1, Loopholes l2) {
Integer riskLevel1 = l1.getRiskLevel();
Integer riskLevel2 = l2.getRiskLevel();
Integer fixed1 = l1.getFixed();
Integer fixed2 = l2.getFixed();
int fixedComp = fixed1.compareTo(fixed2);
if (fixedComp != 0) {
return fixedComp;
} else {
return riskLevel1.compareTo(riskLevel2);
}
}
};
首先用fixed1与fixed2进行比较,若两者不相等,则直接排序,若两者相等(即compartTo返回0),继续比较风险等级并返回风险等级的排序结果。
Java ArrayList中对象的排序 (Comparable VS Comparator)的更多相关文章
- java比较排序Comparable和Comparator
1 比较排序Comparable和Comparator 1.1 接口作用说明 Comparable和Comparator都是用来实现对象的比较.排序,对比时需要实现Compara ...
- Java开发中使用sort排序
Java开发中使用sort排序 BaiduSpring https://baijiahao.baidu.com/s?id=1625440912158830354&wfr=spider& ...
- java学习笔记13--比较器(Comparable、Comparator)
java学习笔记13--比较器(Comparable.Comparator) 分类: JAVA 2013-05-20 23:20 3296人阅读 评论(0) 收藏 举报 Comparable接口的作用 ...
- 对象大小对比之Comparable与Comparator
一 概述 1.Comparable与Comparator使用背景 数值型数据(byte int short long float double)天生可对比大小,可排序,String实现了Compara ...
- Java集合中对象排序
集合中的对象排序需求还是比較常见的.当然我们能够重写equals方法,循环比較:同一时候Java为我们提供了更易使用的APIs.当须要排序的集合或数组不是单纯的数字型时,通常能够使用Comparato ...
- Java中的TreeMap、Comparable、Comparator
我们知道HashMap的存储位置是按照key这个对象的hashCode来存放的,而TreeMap则是不是按照hashCode来存放,他是按照实现的Comparable接口的compareTo这个方法来 ...
- Java:实现对象的比较 comparable接口和comparator接口
在实际应用中,我们往往有需要比较两个自定义对象大小的地方.而这些自定义对象的比较,就不像简单的整型数据那么简单,它们往往包含有许多的属性,我们一般都是根据这些属性对自定义对象进行比较的.所以Java中 ...
- Java对数组对象进行排序
下面是一组对数组对象进行排序的代码: package com.sun; import java.util.ArrayList; import java.util.Arrays; import java ...
- java——ArrayList中常见方法用法
package com.xt.list; import java.util.ArrayList; import java.util.Iterator; import java.util.List; p ...
随机推荐
- Trace 2018徐州赛区网络预赛
题意: 每次给出一个点,然后就会形成两条线,如果后面的矩形覆盖了前面的边,那么这条边就消失了, 最后求剩下的边是多少 题目确保不会完全覆盖 也没有一个矩形在另一个矩形里面 即对于 X1,Y1 X2, ...
- 【刷题】BZOJ 2001 [Hnoi2010]City 城市建设
Description PS国是一个拥有诸多城市的大国,国王Louis为城市的交通建设可谓绞尽脑汁.Louis可以在某些城市之间修建道路,在不同的城市之间修建道路需要不同的花费.Louis希望建造最少 ...
- 【转】结构struct 联合Union和枚举Enum的细节讨论
结构struct 联合Union和枚举Enum的细节讨论 联合(Union)是一种构造数据类型,它提供了一种使不同类型数据类型成员之间共享存储空间的方法,同时可以实现不同类型数据成员之间的自动类型转换 ...
- 【AGC006F】Blackout
Description 题目链接 Solution 首先,把输入矩阵看成邻接矩阵,将问题转化到图上. 现在的问题变成:给定一个有向图,如果存在\((u,v)\)和\((v,w)\),则连边\((w,u ...
- Libre 6006 「网络流 24 题」试题库 / Luogu 2763 试题库问题 (网络流,最大流)
Libre 6006 「网络流 24 题」试题库 / Luogu 2763 试题库问题 (网络流,最大流) Description 问题描述: 假设一个试题库中有n道试题.每道试题都标明了所属类别.同 ...
- Kubernetes 部署 1.9.7 高可用版
转载于https://codegreen.cn/2018/08/30/kubernetes-cluster-1.9.7/ 前言 在部署之前,首先感谢 手动搭建高可用的kubernetes 集群 博文的 ...
- JAVA记录-Servlet RequestDispatcher请求转发
RequestDispatcher接口提供将请求转发送到另一个资源的功能,它可能是html,servlet或jsp等. 此接口也可用于包括另一资源的内容.它是servlet协作的一种方式. 在Requ ...
- svn 更新代码
SVN 更新代码 --force # 强制覆盖 /usr/bin/svn --username user --password passwd co $Code ${SvnPath}src/ # 检出整 ...
- Python 装饰器入门(下)
继续上次的进度:https://www.cnblogs.com/flashBoxer/p/9847521.html 正文: 装饰类 在类中有两种不通的方式使用装饰器,第一个和我们之前做过的函数非常相似 ...
- HTTP Methods
简介 HTTP 定义了一组请求方法,以表明要对给定资源执行的操作.指示针对给定资源要执行的期望动作, 虽然他们也可以是名词,但这些请求方法有时被称为HTTP动词.每一个请求方法都实现了不同的语义,但一 ...