重温java知识(三十四、常用类库之八:比较器)

基本数据类型可以直接确定出数值的大小关系,引用数据类型要想确定大小关系就必须通过比较器来完成。

  • Comparable比较器
  • Comparator比较器

1、使用Comparable比较器实现自定义类对象数组排序的例子:

package com.mydemo;

import java.util.Arrays;

public class ComparableDemo {

    public static void main(String[] args) {

        Member memberA = new Member("张三", 18);
        Member memberB = new Member("李四", 20);
        Member memberC = new Member("王五", 22);
        Member memberD = new Member("赵六", 24);

        Member memberArray[] = new Member[]{
                memberA,
                memberD,
                memberB,
                memberC
        };

        System.out.println("排序前:");
        for (int i = 0; i < memberArray.length; i++){
            System.out.println("姓名:" +memberArray[i].getName() + "、年龄:" + memberArray[i].getAge());
        }
        
        System.out.println("======================");


        // 对象数组排序
        Arrays.sort(memberArray);

        System.out.println("排序后:");

//        System.out.println(Arrays.toString(memberArray));
        for (int i = 0; i < memberArray.length; i++){
            System.out.println("姓名:" +memberArray[i].getName() + "、年龄:" + memberArray[i].getAge());
        }

    }
}

// 自定义类对象实现比较器
class Member implements Comparable<Member> {

    private String name;    // 成员属性
    private int 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;
    }

    /**
     * 构造方法初始化
     *
     * @param name
     * @param age
     */
    public Member(String name, int age) {
        this.name = name;
        this.age = age;
    }

    /**
     * 方法覆写
     *
     * @param o
     * @return
     */
    @Override
    public int compareTo(Member o) {
        if (this.age > o.age) {
            return 1;
        } else if (this.age < o.age) {
            return -1;
        } else {
            return 0;
        }

        // 简化编写格式
//        return this.age - o.age;
    }

    @Override
    public String toString() {
        return "【Member类对象】姓名:" + this.name + "、年龄:" + this.age + "\n";
    }
}
运行结果:
排序前:
姓名:张三、年龄:18
姓名:赵六、年龄:24
姓名:李四、年龄:20
姓名:王五、年龄:22
======================
排序后:
姓名:张三、年龄:18
姓名:李四、年龄:20
姓名:王五、年龄:22
姓名:赵六、年龄:24

2、使用Comparator实现对象数组排序的例子:

package com.mydemo;

import java.util.Arrays;
import java.util.Comparator;

public class ComparableDemo {

    public static void main(String[] args) {


        Member memberArray[] = new Member[]{
                new Member("张三", 18),
                new Member("赵六", 21),
                new Member("王五", 20),
                new Member("李四", 19)
        };


        System.out.println("排序前:");
        for (int i = 0; i < memberArray.length; i++){
            System.out.println("姓名:" +memberArray[i].getName() + "、年龄:" + memberArray[i].getAge());
        }

        System.out.println("======================");


        // 对象数组排序
        Arrays.sort(memberArray, new MeberComparator());

        System.out.println("排序后:");
        for (int i = 0; i < memberArray.length; i++){
            System.out.println("姓名:" +memberArray[i].getName() + "、年龄:" + memberArray[i].getAge());
        }
    }
}

class MeberComparator implements Comparator<Member> {

    /**
     * 覆写
     *
     * @param o1
     * @param o2
     * @return
     */
    @Override
    public int compare(Member o1, Member o2) {
        return o1.getAge() - o2.getAge();
    }
}

// 自定义类
class Member {
    private String name;
    private int age;

    /**
     * 构造方法初始化
     *
     * @param name
     * @param age
     */
    public Member(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "Member{" +
                "name='" + this.name + '\'' +
                ", age=" + this.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;
    }
}
运行结果:
排序前:
姓名:张三、年龄:18
姓名:赵六、年龄:21
姓名:王五、年龄:20
姓名:李四、年龄:19
======================
排序后:
姓名:张三、年龄:18
姓名:李四、年龄:19
姓名:王五、年龄:20
姓名:赵六、年龄:21
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值