JAVA实现自定义比较器Comparator 和 Comparable

Posted 泡^泡

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JAVA实现自定义比较器Comparator 和 Comparable相关的知识,希望对你有一定的参考价值。

JAVA有两种比较器,分别是:Comparator 和 Comparable
我看网上说Comparable是内部比较器,而Comparator是外部比较器,由于这两个都是接口,所以都需要去实现,而实现Comporable接口则需要实现compareTo方法,实现Comparator需要实现compare方法。Comparable接口一般由要比较的类实现,所以叫内部比较器,而comparator比较器一般是单独实现,或者匿名内部类实现。
例如:

public class Person implements Comparable<Person> 
	int age;
	public Person(int age) 
		this.age = age;
	
	@Override
	public int compareTo(Person person) 
		// TODO Auto-generated method stub
		return this.age - person.age;
	

测试代码:

public class TestComparator 
public static void main(String[] args) 
		List<Person> list = new ArrayList<>();
		list.add(new Person(12));
		list.add(new Person(9));
		list.add(new Person(10));
		list.add(new Person(22));
		System.out.println("排序前:");
		for (int i = 0; i < list.size(); i++) 
			System.out.print(list.get(i).age + "  ");
		
		System.out.println("排序后:");
		Collections.sort(list);
		for (int i = 0; i < list.size(); i++) 
			System.out.print(list.get(i).age + "  ");
		
	

运行结果:

排序前:
12  9  10  22  
排序后:
9  10  12  22  

自定义比较器:

public class myComparator implements Comparator<Person> 

	@Override
	public int compare(Person p1, Person p2) 
		// TODO Auto-generated method stub
		return p2.age - p1.age;
	

然后在比较的时候把它给传过去:

//接上面的测试方法
	System.out.println("\\n" + "使用自定义比较器排序后:");
		Collections.sort(list, new myComparator());
		for (int i = 0; i < list.size(); i++) 
			System.out.print(list.get(i).age + "  ");
		

运行结果如下:

排序前:
12  9  10  22  
排序后:
9  10  12  22  
使用自定义比较器排序后:
22  12  10  9  

综上,两者的区别是实现Comparator接口代码更加灵活,可以定义某个类的多个比较器,从而在排序时根据实际场景自由调用,而Comparable接口实现后便不能改动。

以上是关于JAVA实现自定义比较器Comparator 和 Comparable的主要内容,如果未能解决你的问题,请参考以下文章

Java中Comparable和Comparator比较

java自定义类型 比较排序 Comparator接口

java中Comparable和Comparator两种比较器的区别

java中Comparable和Comparator区别和总结

java.ArrayList集合调用并重写sort方法,使用时报错

Comparable接口和Comparator接口