(比较器)Comparator比较器

Comparator比较器

Comparator属于一种挽救的比较器支持,其主要目的是解决一些没有使用Comparable排序的类的对象的排序操作。

范例:程序项目已经开发完成了,并且由于先期的设计并没有去考虑到比较器功能

class Person{
	private String name;
	private int age;
	
	public Person(String name,int age) {
		
		this.name = name;
		this.age = age;
		
	}
	
	//setter、getter略
	public String toString() {
		
		return "【Person类对象】姓名:"+this.name +"、年龄:"+this.age+"\n";
		 
	}
}

后来经过了若干版本的迭代更新后发现需要对Person类进行排序处理,但是又不能修改Person类(无法实现Comparable接口),所以这是就需要采用一种挽救的形式来实现比较,在Arrays类里面排序有另外一种实现:

  • 基于Comparator的排序处理:public static <T> sort(T[] a ,Comparator <? super T> c)

在java.util.Compatator里面最初之定义有一个排序的compare()方法(public int compare(T o1,T o2)),但是后来持续发展又出现了许多的static方法。

范例:基于Comparator实现排序处理

 

class Person{
	private String name;
	private int age;
	
	public Person(String name,int age) {
		this.name = name;
		this.age = age;
	}
	
	public void setName(String name) {
		this.name = name;
	}
	public void setAge(int age) {
		this.age = age;
	}
	
	public String getName() {
		return this.name;
	}
	public int getAge() {	
		return this.age;
	}
	
	public String toString() {
		return "【Person类对象】姓名:"+this.name +"、年龄:"+this.age+"\n";
	} 
}

class PersonComparator implements Comparator<Person>{

	@Override
	public int compare(Person o1, Person o2) {
		return o1.getAge() - o2.getAge();	//当前数据与小于传入的对象返回负数,大于返回整数,等于返回0
	}
	  
}

在测试类进行排序处理的时候就可以利用规则实现操作。

public static void main(String[] args) {
		Person[] data = new Person[] {
				new Person("王五",19),
				new Person("张三",80),
				new Person("李四",41),
				new Person("周一",50)
			};
		Arrays.sort(data,new PersonComparator());	//进行对象数组的排序
		System.out.println(Arrays.toString(data));	//输出
	}

[【Person类对象】姓名:王五、年龄:19
, 【Person类对象】姓名:李四、年龄:41
, 【Person类对象】姓名:周一、年龄:50
, 【Person类对象】姓名:张三、年龄:80
]

对于这种排序的操作如果不是必须的情况下不建议使用。

面试题:请解释Comparable与Comparator的区别?

  • java.lang.Comparable是在类定义的时候实现的父接口,主要用于定义排序规则,里面只有一个compareTo()方法
  • java.ytil.Comparator是挽救的比较器操作,需要设置单独的比较器规则实现排序,里面有compare()方法。
  •  

猜你喜欢

转载自blog.csdn.net/weixin_46245201/article/details/112628474