Java的比较器Comparable和Comparator用法

90 阅读1分钟

不要自卑,去提升实力
互联网行业谁技术牛谁是爹
如果文章可以带给你能量,那是最好的事!请相信自己
加油o~

1.Comparable

需要将所需排序的类实现Comparable接口,并实现内部的comparaTo方法,比较数值可用对应包装类的compare(也可以用做差形式),比较字符用String的compareTo自然情况都是从小到大排序,可在前面加个-号

2.Comparator

调用方法Collections.sort(list,new Comparator(){
public int compare(Person a,Person b){
return ;
})
重写内部的compare方法,重写方式和Comparable的相同

/**
 *作者:魏宝航
 *2020年11月24日,上午20:30
 */
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.Scanner;

public class Java比较器 {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		List<Person> list = new ArrayList<Person>();
		Person p;
		for (int i = 0; i < n; i++) {
			p = new Person();
			p.name = sc.next();
			p.grade = sc.nextInt();
			list.add(p);
		}
		//第一种是对排序的类进行实现comparable接口,重写内部的compareTo方法
		//比较数值可用对应包装类的compare,比较字符用String的compareTo
		//自然情况都是从小到大排序,可在前面加个-号
		Collections.sort(list);
		//第二种方式(利用比较器,自定义排序方式,重写compare方法)
		/*Collections.sort(list,new Comparator<Person>() {
			public int compare(Person a,Person b)
			{
				if(a.grade==b.grade)
				{
					return a.name.compareTo(b.name);
				}
				else {
					return -Integer.compare(a.grade, b.grade);
				}
			}
		});*/
		Iterator<Person> iterator = list.iterator();
		while (iterator.hasNext()) {
			System.out.println(iterator.next());
		}

	}
}

class Person implements Comparable<Person> {
	String name;
	int grade;

	public Person() {

	}

	public Person(String name, int grade) {
		this.name = name;
		this.grade = grade;
	}
	//重写方法,以便于输出想要数据
	public String toString() {
		return name + " " + grade;
	}

	@Override
	public int compareTo(Person a) {
		if (this.grade == a.grade)
			return this.name.compareTo(a.name);
		else {
			return -Double.compare(this.grade, a.grade);
		}
	}
}