自定义比较器
java中想要比较自定义类,可以有两种自定义比较器的方法:一是通过实现Comparable接口的compareTo()方法来使得自定义对象可比来实现。二是通过实现Comparator接口的compare方法
第一种
- 可以通过实现Comparable接口的compareTo()方法来使得自定义对象可比来实现。
- compareTo()方法,只有一个参数,返回值为int。返回值大于0表示对象大于参数对象;小于0表示对象小于参数对象;等于0表示两者相等。
【声明】
record类重写compareTo方法,先按id比较 ,相同id则按ts比。
@Override
public int compareTo(record o) {
if(this.id==o.id)
return this.ts-o.ts;//若return o.ts-this.ts;则为降序
else
return this.id-o.id;
}
【调用】
声明的是record类数组则使用Arrays.sort()排序
record blog[]=new record[N];
Arrays.sort(blog);
若是集合类则使用Collections.sort()排序
List<record> blog=new ArraysList<record>;
Collections.sort(blog);
【题目来源】
第九届蓝桥杯javaB组日志统计
自定义record类,record类存放每条记录的时间ts的评论id,通过实现Comparable的compareto方法,使得对于存放record类对象的数组blog排序时按自定义的排序规则排序,即:先按id比较,相同id则按ts比,升序输出。
【详细代码】
package 第九届;
import java.util.Arrays;
import java.util.Scanner;
/**
* @author JohnnyLin
* @version Creation Time:2020年5月30日 下午2:48:40
* 类说明
*/
public class t08_日志统计2 {
//record类存放每条记录对应的时间和id
//record实现comparable接口 以实现每条记录的排序
public static class record implements Comparable<record>{
int id,ts;
record(int id,int ts){
this.id=id;
this.ts=ts;
}
//重写compareTo方法 先按id比较 相同id则按ts比
@Override
public int compareTo(record o) {
if(this.id==o.id)
return this.ts-o.ts;
else
return this.id-o.id;
}
}
public static void main(String[] args) {
Scanner reader=new Scanner(System.in);
int N=reader.nextInt();
int D=reader.nextInt();
int K=reader.nextInt();
//声明一个存放每一条点赞记录的数组
record blog[]=new record[N];
boolean flag[]=new boolean[100000];
for(int i=0;i<N;i++) {
int ts=reader.nextInt();
int id=reader.nextInt();
//每一个blog[i]对应存放一条记录
blog[i]=new record(id,ts);
}
Arrays.sort(blog);
}
}
【输入】
7 10 2
0 1
0 10
10 10
10 1
9 1
100 3
100 3
【输出】
排完序之后
1 0
1 9
1 10
3 100
3 100
10 0
10 10
第二种
- 通过实现Comparator接口的compare方法
- compare方法有两个参数,返回值与Comparable的compareTo()方法一样.
- Comparator接口一般不会被集合元素类所实现,而是单独实现或者匿名内部类方式实现。如上述类中,Comparator不直接在Edge类实现,因此Edge类结构未发生变化.
【声明即调用】
//声明列表 edgeList
List<Edge> edgeList=new ArrayList<Edge>()
略去往edgeList中加入元素的代码
//对edgeList按Edge的distance值排序
Collections.sort(edgeList, new Comparator<Edge>() {
public int compare(Edge o1, Edge o2) {
return o1.distance-o2.distance;//升序
}
});
【详细代码】
class Edge{
//两个顶点
private String start;
private String end;
//两个顶点距离
int distance;
public Edge(String a, String b, int d) {
start =a;
end =b;
distance=d;
}
public String getStart() {
return start;
}
public String getEnd() {
return end;
}
}
//声明列表 edgeList
List<Edge> edgeList=new ArrayList<Edge>()
//往列表添加元素代码省略
//对edgeList按Edge的distance值排序
Collections.sort(edgeList, new Comparator<Edge>() {
public int compare(Edge o1, Edge o2) {
return o1.distance-o2.distance;//升序
}
});