Java比较器的简单使用

Comparable 接口的使用: 自然排序
1.像String、包装类等实现了Comparable接口,重写了compareTo()方法,给出了比较两个对象大小的方式
2.像String、包装类重写compareTo()方法之后,进行了从小到大的排列
例如:

    @Test
    public void test1(){
        String[] arr = new String[]{"AA","CC","KK","MM","GG","JJ","DD"};
        Arrays.sort(arr);
        System.out.println(Arrays.toString(arr));
    }

结果为:
Java比较器的简单使用_第1张图片
3.重写compareTo(obj)的规则:
​ 如果当前对象this大于形参对象obj,则返回正整数
​ 如果当前对象this小于形参对象obj,则返回复数
​ 如果当前对象this等于形参对象obj,则返回0

4.对于自定义类来说,如果要排序,可以让自定义类实现Comparable接口,重写compareTo()方法,在compareTo(obj)方法中指明如何排序
例如:

package base.compare;

/**
 * @author Feifu
 * @create 2020-03-20
 *
 * 商品类
 */
public class Goods implements Comparable<Goods>{//指定泛型

    private String name;
    private double price;

	//这里省略getter/setter,构造方法和toString()方法

    //指明商品比较大小的方式:先按照价格从低到高排序
    @Override
    public int compareTo(Goods goods) {

        if (this.price > goods.price) {
            return 1;
        } else if (this.price < goods.price) {
            return -1;
        } else {
            return 0;
        }
    }
}

测试:

    @Test
    public void test2(){
        Goods[] arr = new Goods[4];
        arr[0] = new Goods("8848",8848);
        arr[1] = new Goods("o泡果奶",10);
        arr[2] = new Goods("n夫山泉",2);
        arr[3] = new Goods("m服限定",199);

        Arrays.sort(arr);
        for (Goods goods : arr) {
            System.out.println(goods);
        }
    }

排序结果:
Java比较器的简单使用_第2张图片
可以根据需求在compareTo()中修改相应的逻辑

    //指明商品比较大小的方式:先按照价格从低到高排序,在按照产品名称从高到低排序
    @Override
    public int compareTo(Goods goods) {

        if (this.price > goods.price) {
            return 1;
        } else if (this.price < goods.price) {
            return -1;
        } else {
 //           return 0;
           return -this.name.compareTo(goods.name);
        }
    }

将上面测试内容中’o泡果奶’的价格改为2,排序结果为
Java比较器的简单使用_第3张图片

Comparator接口的使用: 定制排序
1.使用场景
当元素的类型没有实现Comparable接口而又不方便修改代码
或者实现了Comparable接口的排序规则不适合当前的操作,那么就可以使用Comparator的对象来排序

2.重写compare(Object o1,Object o2)方法,比较o1和o2的大小;
​ 如果返回正整数,表示o1大于o2
​ 如果返回负整数,表示o1小于o2
​ 如果返回0,表示o1等于o2

例如:

    @Test
    public void test3(){
        String[] arr = new String[]{"AA","CC","KK","MM","GG","JJ","DD"};
        Arrays.sort(arr, new Comparator<String>() {//使用匿名对象
            @Override
            public int compare(String o1, String o2) {
                //按照字符串从大到小顺序排列
                return -o1.compareTo(o2);
            }
        });
        
        System.out.println(Arrays.toString(arr));
    }

结果:
Java比较器的简单使用_第4张图片

自定义类使用定制排序

    @Test
    public void test4(){
        Goods[] arr = new Goods[5];
        arr[0] = new Goods("8848",8848);
        arr[1] = new Goods("o泡果奶",2);
        arr[2] = new Goods("n夫山泉",2);
        arr[3] = new Goods("m服限定",199);
        arr[4] = new Goods("opgn",10);

        Arrays.sort(arr, new Comparator<Goods>() {//使用匿名对象
            @Override
            public int compare(Goods o1, Goods o2) {
                //先按照产品名称从低到高,再按照价格从高到低
                if(o1.getName().equals(o2.getName())){
                    //名称相同时,比较价格
                    return -Double.compare(o1.getPrice(),o2.getPrice());
                } else {
                    return o1.getName().compareTo(o2.getName());
                }
            }
        });

        for (Goods goods : arr) {
            System.out.println(goods);
        }
    }

结果为:
Java比较器的简单使用_第5张图片

你可能感兴趣的:(Java)