比较器:Comparable和Comparator

119 阅读2分钟
  • 问题引入

我们会经常会对集合排序,如果该集合存储的数据具有自然排序功能,我们就会直接使用Collections.sort()方法直接进行排序。但是如果存储的数据没有自然排序的功能,我们就需要自定义比较器来实现对集合需求排序。自定义的排序有两种,分别使用Comparable和Comparator两个接口实现。

  • 两种比较器的区别

第一:来源不同

Comparable属于java.lang包下的接口,而Comparator属于java.util包下的接口;

第二:重写的方法不同

Comparable重写compareTo(Object o)方法,而Comparator需要重写compare方法

第三:实现的位置不同

Comparable需要实现在比较对象的类上,而Comparator作为一个工具类自定义实现,经常使用匿名内部类来实现的。

  • 比较器的实现-Comparable
//类实现的接口(Comparable)
public class Person implements Comparable<Person>{
	String name;
	int age;
	
	public String getName() {
		return name;
	}
	
	public void setName(String name) {
		this.name = name;
	}
	
	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}
	
	public Person(String name, int age) {
		this.name = name;
		this.age = age;
	}
	
	public Person(){}

	@Override
	public String toString() {
		return "Person [name=" + name + ", age=" + age + "]";
	}
	
	/*
		重写的方法
	*/
	@Override
	public int compareTo(Person p) {
		if(this.age == p.age){
			return 0;
		}else{
			return this.age - p.age > 0 ? 1 : -1;
		}
	}
}

/*
	测试小例
*/
public static void main(String[] args) {

		Person p1 = new Person("刘亮",26);
		Person p2 = new Person("白鸽",24);
		Person p3 = new Person("老冯",27);
		Person p4 = new Person("阿张",22);
		
		List<Person> list = new ArrayList<Person>();
		list.add(p1);
		list.add(p2);
		list.add(p3);
		list.add(p4);
		
		System.out.println(list);
		Collections.sort(list);
		System.out.println("排序后-------------------------");
		System.out.println(list);
	}
}
  • 比较器的实现-Comparator
public class CompareDemo {

	@SuppressWarnings("all")
	public static void main(String[] args) {

		Person p1 = new Person("刘亮",26);
		Person p2 = new Person("白鸽",24);
		Person p3 = new Person("老冯",27);
		Person p4 = new Person("阿张",22);
		
		List<Person> list = new ArrayList<Person>();
		list.add(p1);
		list.add(p2);
		list.add(p3);
		list.add(p4);
		
		System.out.println(list);
		System.out.println("排序后-------------------------");
	
		Collections.sort(list,new Comparator<Person>(){
			@Override
			public int compare(Person p1, Person p2) {
				if(p1.age == p2.age){
					return 0;
				}else{
					return p1.age - p2.age > 0 ? 1 : -1;
				}
			}});
		
		System.out.println(list);
	}
}
  • 运行结果

两种方法运行的结果相同:

[Person [name=刘亮, age=26], Person [name=白鸽, age=24], Person [name=老冯, age=27], Person [name=阿张, age=22]] 排序后------------------------------------------------------------------------------------------------- [Person [name=阿张, age=22], Person [name=白鸽, age=24], Person [name=刘亮, age=26], Person [name=老冯, age=27]]

  • 注意

两个中方法不要同时使用,以免发生冲头。只选用一种即可

  • 汉字首字母的排序

汉字首字母的排序需要特殊的类,但是同样需要创建比较器(Comparator),这个类是Collator。该类已经实现了Comparator接口,只会执行区分语言环境的 String 比较。所以这个比较器只能比较字符串。

  • 汉字排序小例
public class CompareDemo {

	public static void main(String[] args) {
	//这里传递的参数环境的语言类型,如果不传递参数表示默认的环境类型(系统环境)
	Comparator<Object> comparator = Collator.getInstance(Locale.CHINA);
	ArrayList<String> arrayList = new ArrayList<>();
	arrayList.add("中国");
	arrayList.add("陕西");
	arrayList.add("武汉");
	arrayList.add("瑞士");
	
	System.out.println(arrayList);
	Collections.sort(arrayList, comparator);
	System.out.println("汉字首字母排序后--------------------------------------");
	System.out.println(arrayList );
}

/*
	运行结果:
	
	[中国, 陕西, 武汉, 瑞士]
	汉字首字母排序后----------
	[瑞士, 陕西, 武汉, 中国]
*/