Java中的比较器:自定义规则!!!

比较器

Java语言中的比较器分为两种:
Comparable比较器:Comparable是排序接口;若一个类实现了Comparable接口,就意味着“该类支持排序”。(作用在实体类上)同时也被称之为:内部比较器
Comparator比较器:我们若需要控制某个类的次序,可以建立一个“该类的比较器”来进行排序。(作用在排序类上)同时也被称之为:外部比较器
案例 1 内部比较器:
先创建一个类:

public class House implements Comparable<House>{

    //房子的面积及总价
    private int area;
    private int money;
    public House() {
    }

    public House(int area, int money) {
        this.area = area;
        this.money = money;
    }

    @Override//自定义比较规则:按照面积比大小 (负数 0 正数)
    public int compareTo(House o) {
        return this.getArea()-o.getArea();
    }
    
    @Override
    public String toString() {
        return "House{" +
                "area=" + area +
                ", money=" + money +
                '}';
    }

    public int getArea() {
        return area;
    }

    public void setArea(int area) {
        this.area = area;
    }

    public int getMoney() {
        return money;
    }

    public void setMoney(int money) {
        this.money = money;
    }


}

创建测试类:

public class TestHouse {

    public static void main(String[] args) {

        House h1 = new House(90, 1000000);
        House h2 = new House(100, 1500000);
        House h3 = new House(50, 500000);
        House h4 = new House(80, 2000000);
        House h5 = new House(70, 1600000);

        House[] houses={h1,h2,h3,h4,h5};
        System.out.println("排序前!");
        System.out.println(Arrays.toString(houses));
        System.out.println("排序后!");
        //给对象排序时,需要实体类实现 Comparable 接口,才可以实现排序
        Arrays.sort(houses);
        System.out.println(Arrays.toString(houses));
    }

}

输出的结构为:
排序前!
[ 面积=90 价格=1000000 , 面积=100 价格=1500000 , 面积=50 价格=500000 , 面积=80 价格=2000000 , 面积=70 价格=1600000 ]
排序后!
[ 面积=50 价格=500000 , 面积=70 价格=1600000 , 面积=80 价格=2000000 , 面积=90 价格=1000000 , 面积=100 价格=1500000 ]

因此可以看出排序依据按照我们定义的规则完成!!!

案例 2 外部比较器:
先创建一个任意类来进行我们的操作:

public class Dog {

    private String name;
    private int age;

    @Override
    public String toString() {
        return
                "名字=" + name +
                "年龄=" + age;
    }

    public Dog() {
    }

    public Dog(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public 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;
    }


}

再创建一个外部比较器类继承 Comparator 接口并写 compare 方法:

public class CompareDog implements Comparator<Dog> {
    @Override
    public int compare(Dog o1, Dog o2) {
        //return o1.getAge()-o2.getAge();根据年龄排序
        //把每个字符变成int类型后再进行比较
        return o1.getName().compareTo(o2.getName());//根据名字排序
    }

}

最后创建测试类测试:

public class TestDog {
    public static void main(String[] args) {

        Dog[]dogs={
                    new Dog("菲菲",5),
                    new Dog("前前",9),
                    new Dog("嘿嘿",1),
                    new Dog("蕾蕾",6),
                    new Dog("牛牛",4)
        };
        System.out.println("排序前:");
        System.out.println(Arrays.toString(dogs));

        System.out.println("排序后:");
        Arrays.sort(dogs,new CompareDog());
        System.out.println(Arrays.toString(dogs));

    }
}

运行结果为:
排序前:
[ 名字=菲菲 年龄=5 , 名字=前前 年龄=9 , 名字=嘿嘿 年龄=1 , 名字=蕾蕾 年龄=6 , 名字=牛牛 年龄=4 ]
排序后:
[ 名字=嘿嘿 年龄=1 , 名字=牛牛 年龄=4 , 名字=菲菲 年龄=5 , 名字=蕾蕾 年龄=6 , 名字=前前 年龄=9 ]
因此可以看出排序依据按照我们定义的规则完成!!!
当然名字也可以排序,按照汉字的排序规则排序!

上一篇:list字典嵌套


下一篇:从法外狂徒张三卖房引起的代理模式