Java比较器

Comparable接口的使用(自然排序)

  1. 像String、包装类等实现了Comparable接口,重写了compareTo(obj)方法,给出了比较两个对象的大小方式。

  2. 重写compareTo(obj)的规则

    1. 如果当前对象this大于形参对象obj,则返回正整数
    2. 如果当前对象this小于形参对象obj,则返回负整数
    3. 如果当前对象this等于形参对象obj,则返回零
  3. 对于自定义类来说,如果需要排序,我们可以让自定义类实现Compareable接口,重写compareTo(obj)方法,在compareTo(obj)方法中指明如何排序。

java.util.Comparator接口的使用(定制排序)

  1. 应用背景:当元素的类型没有实现java.lang.Comparable接口而又不方便修改代码,或者实现了java.lang.Comparable接口的排序规则不适合当前的操作,那么可以考虑使用 Comparator 的对象来排序。
  2. 重写compare(Object o1,Object o2)方法,比较o1和o2的大小:
    1. 如果方法返回正整数,则表示o1大于o2;
    2. 如果返回0,表示相等;
    3. 如果返回负整数,表示o1小于o2。

Comparable接口与Comparator接口的对比

  1. Comparable接口的方式一旦指定,保证Comparable接口实现类的对象在任何位置都可以比较大小
  2. Comparator接口却是临时性的一种比较

举例

package com.yicurtain.CommonClass;

public class Goods implements Comparable{
    private    String name;
    private    double price;

    public Goods() {
    }

    public Goods(String name, double price) {
        this.name = name;
        this.price = price;
    }

    public String getName() {
        return name;
    }

    public double getPrice() {
        return price;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setPrice(double price) {
        this.price = price;
    }

    @Override
    public String toString() {
        return "Goods{" +
                "name='" + name + '\'' +
                ", price=" + price +
                '}';
    }

    @Override
    public int compareTo(Object o) {
        if (o instanceof Goods){
            Goods goods=(Goods)o;//Object>Goods
            if (this.price> goods.price){
                return 1;
            }else if (this.price< goods.price){
                return -1;
            }
            return 0;
        }
         throw new RuntimeException("输入的数据类型不一致");
    }
}

package com.yicurtain.CommonClass;

import java.util.Arrays;

public class GoodsTest {
    public static void main(String[] args) {
        Goods[] all = new Goods[4];
        all[0]=new Goods("红楼梦",100);
        all[1]=new Goods("西游记",80);
        all[2]=new Goods("三国演义",140);
        all[3]=new Goods("水浒传",120);
        Arrays.sort(all);
        System.out.println(Arrays.toString(all));
    }
}

posted on 2021-06-27 17:14  yicurtain  阅读(53)  评论(0)    收藏  举报