Java比较器

115 阅读2分钟

1. 实现对象的排序

可以考虑两种方法,自然排序、定制排序

2. 方式一: 实现Comparable接口的方式

实现步骤:
① 具体的类A实现 Comparable 接口
② 重写 Comparable 接口中的 compareTo(object ob) 方法,在此方法中指明比较类A的对象的大小的标准
③ 创建类A的多个实例,进行大小的比较或排序。

当前的类需要实现 Comparable 中的抽象方法:compareTo(Object o)在此方法中,指明如何判断当前类的对象的大小。比如: 按照年龄的大小进行比较。 (或从低到高排序)
如果返回值是正数:当前对象大
如果返回值是负数:当前对象小
如果返回值是0,一样大
public class compare implements Comparable {

@Override
public int compareTo(Object o) {
    if (o == this) {
        return 0;
    }
    if (o instanceof compare) {
        compare c = (compare) o;
        return c.age - this.age;
    }
    throw new RuntimeException("类型不匹配");
}
}


比较标准:先比较年龄,如果年龄相同,再比较姓名
@Override
public int compareTo(Object o) {
    if (o == this) {
        return 0;
    }
    if (o instanceof compare) {
        compare c = (compare) o;
        int value = c.age - this.age;
        if(value != 0){
            return value;
        }
        return c.name.compareTo(this.name);
    }
    throw new RuntimeException("类型不匹配");
}
}

3. 方式二:实现Comparator接口的方式

实现步骤:
①创建一个实现了 Comparator 接口的实现类A
②实现类A要求重写 Comparator 接口中的抽象方法 compare(0bject o1,bject 2),在此方法中指明要比较大小的对象的大小关系。(比如,string类、Product类)
③创建此实现类A的对象,并将此对象传入到相关方法的参数位置即可。(比如,Arrays.sort(..,类的实例))

public static void main(String[] args) {
    compare[] c = new compare[5];

    c[0] = new compare("Tom",18);
    c[1] = new compare("Tony",18);
    c[2] = new compare("lucky",41);
    c[3] = new compare("lucci",23);
    c[4] = new compare("curry",34);

    //创建一个实现Comparator接口的实现类的对象
    Comparator comparator = new Comparator() {
        @Override
        public int compare(Object o1, Object o2) {
            if (o1 instanceof compare && o2 instanceof compare) {

                compare c0 = (compare) o1;
                compare c1 = (compare) o2;

                return c0.getAge()-c1.getAge();
            }
            throw new RuntimeException("类型不匹配");
        }
    };

    Arrays.sort(c,comparator);

    for (int i = 0; i<c.length ; i++){
        System.out.println(c[i]);
    }
}

4. 对比两种方式

角度一
    自然排序:单一的,唯一的
    定制排序:灵活的,多样的
角度二
    自然排序:一劳永逸的
    定制排序:临时的
角度三:细节
    自然排序: 对应的接口是comparable,对应的抽象方法compareTo(object obj)
    定制排序: 对应的接口是Comparator,对应的抽象方法compare(object obj1,0bject obj2)