自定义比较器

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;//升序
				
				}
		});