Java中自定义比较器

387 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

Java中自定义比较器 今天写算法题的时候需要用到数组排序,而且是自定义的,这块知识欠缺,就进行了相应的资料查询。

以我自己的理解,Java中自定义比较器有三种

1、数组比较器

数组比较器用到了Arrays的工具类,此类中提供了许多静态方法,其中sort是默认升序,并且我查看了sort的源代码,使用的是快速排序: 在这里插入图片描述 快速排序相信大家都不陌生,这里不再多说了。 刚才说到sort默认是升序,如果我们想要降序呢? 在这里插入图片描述 Arrays提供了自定义实现排序,就是自己重新实现Comparator(下面要解释)

Arrays.sort(arr, new Comparator<Integer>() { // arr是数组名,<>中是待排序集合所包含的数据类型
	@Override
	public int compare(int a, int b){  // 待排序集合中的元素是什么数据类型,这里的两个函数参数就定义为什么数据类型
		 return a - b;   升序
		// return b - a;   降序
		// a - b > 0 交换ab位置,反之不变, 即返回值为正数时,交换数组中正在比较的
		//两个元素的位置,返回值为负数时,不交换。 
		}
	})

但是我看大家的写法用到了lambda表达式(JDK8新特性),更加简洁了

在这里插入图片描述 lc406:

public int[][] reconstructQueue(int[][] people) {
        //贪心
        //两个维度,先按身高排序,再按大的身高的k插入

        //按身高排序
        Arrays.sort(people,(a,b) ->{
            if (a[0] == b[0]) {
                return a[1] - b[1];  //升序
            }else {
                return b[0] - a[0];  //降序
            }
        });

        LinkedList<int[]> queue = new LinkedList<>();
        for (int[] p : people) {
            queue.add(p[1],p);   //根据k插入,也即是下标
        }

        return queue.toArray(new int[people.length][]);
    }

2、集合比较器

在数组中使用Arrays作为工具类,在集合中的工具类为Collections 原理其实都一样。

3、自定义类比较器

上面讲到的都是java自身的数据类型包装类,如果我们自己定义的类需要比较的话,我们有两种方法:

  • 实现Comparable接口
  • Comparator接口

1、实现Comparable接口必须实现comparaTo(Object obj)方法,两个对象即通过 compareTo(Object obj) 方法的返回值来比较大小

class Goods implements Comparable {
	private String name;
	private double price;
	//按照价格,比较商品的大小
	@Override
	public int compareTo(Object o) {
		if(o instanceof Goods) {
		Goods other = (Goods) o;
		if (this.price > other.price) {
			return 1;
		} else if (this.price < other.price) {
			return -1;
		}
		return 0;
		}
		throw new RuntimeException("输入的数据类型不一致");
	}
		//构造器、getter、setter、toString()方法略
}

2、 使用Comparator时需要实现compare方法,也即是我们上面Arrays.sort所用到的。

源码中只有一个compare类 在这里插入图片描述 在这里插入图片描述

@FunctionalInterface :函数式接口,意思是接口中不能再添加其他的类;

Goods[] all = new Goods[4];
all[0] = new Goods("War and Peace", 100);
all[1] = new Goods("Childhood", 80);
all[2] = new Goods("Scarlet and Black", 140);
all[3] = new Goods("Notre Dame de Paris", 120);
Arrays.sort(all, new Comparator() {
	@Override
	public int compare(Object o1, Object o2) {
		Goods g1 = (Goods) o1;
		Goods g2 = (Goods) o2;
		return g1.getName().compareTo(g2.getName());
	}
});