浅谈JAVA中的两个比较器Comparator与Comparable

一、Compable

首先我们了解一下自然排序:

 自然排序:人类对常识认知的升序排序,例如我们知道的123....,abc...等等

Comparable接口又叫内部比较器,主要用于内部元素之间的比较,我们学过的Integer以及String就是实现了这个接口的自然排序,它的抽象方法compareTo 用于自身元素比较对对象进行排序

代码示例:

创建一个people类,按照年龄从小到大升序排序

/***/
public class People implements Comparable<People> {
	//姓名
	private String name;
	//年龄
	private int age;
	ublic 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 People(String name, int age) {
		this.name = name;
		this.age = age;
	}
	//按照年龄升序排序
	@Override
	public int compareTo(People p) {
		return this.age-p.age;
	}
	@Override
	public String toString() {
		// TODO 自动生成的方法存根
		return "名字:" + name +age+ "岁";
	}

}

测试:

public class Test {
	// 创建一个集合把元素加进去
	public static List<People> list = new ArrayList<People>();

	static {
		list.add(new People("张三", 25));
		list.add(new People("李四", 45));
		list.add(new People("王五", 23));
		list.add(new People("小白", 27));
		list.add(new People("小红", 35));
		list.add(new People("莉莉", 15));
	}

	public static void main(String[] args) {
		//基于实现的compareTo方法排序
		Collections.sort(list);
		list.forEach(s -> System.out.println(s));
	}

}

输出结果:

a
但是在实际开发中,基于Comparable实现的比较不能满足我们现有的需要,那么就需要修改这个类的比较方法compareTo,但是我们知道开闭原则,最好不要对已经交付的类进行修改,这个时候我们就需要引入外部比较器Comparator.

二、Comparator

Comparator又叫外部比较器,当内部比较器满足不了实际要求或者不存在时,就需要用Comparator来定制比较规则,通过compare方法对两个对象进行比较排序。还以上面例子再做研究,现在我们需要年龄从大到小降序排序。

代码示例

public class Test {
	// 创建一个集合把元素加进去
	public static List<People> list = new ArrayList<People>();

	static {
		list.add(new People("张三", 25));
		list.add(new People("李四", 45));
		list.add(new People("王五", 23));
		list.add(new People("小白", 27));
		list.add(new People("小红", 35));
		list.add(new People("莉莉", 15));
	}

	public static void main(String[] args) {
		//Comparator的Lambda表达式
		Collections.sort(list, (p1, p2) -> p2.getAge() - p1.getAge());
		list.forEach(p -> System.out.println(p));
	}

}

输出结果:

在这里插入图片描述
(两个接口的两个方法都约定成俗,大于返回1,等于返回0,小于返回-1)

猜你喜欢

转载自blog.csdn.net/m0_47547434/article/details/107297070
今日推荐