java自定义对象实现排序

对象排序有两种方法,自定义排序和实现Java中的比较器接口排序。
对自定义对象排序,我们可以根据自定义对象的数据结构,自定义排序规则来实现。也可以用Java中的两个常用的接口Comparable和Comparator,实现将自定义对象排序。

本片文章就如何用java中的两个接口Comparable和Comparator实现自定义对象排序进行讲解。

1. 实现Comparable接口

Comparable接口对实现该接口的每个类的对象强加一个整体排序,这个排序称为类的自然排序(升序),该接口有且只有一个方法int compareTo(T o),compareTo方法称为自然比较方法。继承此接口需要实现该方法。compareTo返回值-1、0、1。***可以在此方法中自定义比较规则***
。Collections.sort (和Arrays.sort )可以自动对实现此接口的对象进行列表(和数组)排序。

public class SubComparator implements Comparable<SubComparator> {

    private String name;

    private Integer num = 2;

    public String getName() {
        return name;
    }

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

    public SubComparator() {

    }

    public Integer getNum() {
        return num;
    }

    public void setNum(Integer num) {
        this.num = num;
    }

    @Override
    public int compareTo(SubComparator o) {
        if (num > o.getNum()) {
            return 1;
        } else if (num < o.getNum()) {
            return -1;
        } else {
            return 0;
        }
    }
}
public class TestComparatble {

    public static void main(String[] args) {
        SubComparator s1 = new SubComparator();
        s1.setName("s1");
        s1.setNum(4);
        SubComparator s2 = new SubComparator();
        s2.setName("s2");
        s2.setNum(8);
        SubComparator s3 = new SubComparator();
        s3.setName("s3");
        s3.setNum(12);
        SubComparator s4 = new SubComparator();
        s4.setName("s4");
        s4.setNum(6);
        List<SubComparator> list = new ArrayList<>();
        list.add(s1);
        list.add(s2);
        list.add(s3);
        list.add(s4);
        Collections.sort(list);
        for (SubComparator subComparator : list) {
            System.out.println(subComparator.getName());
        }
    }
}

2.实现Comparator接口

将比较器传递给排序方法(Collections.sort或Arrays.sort ),对不具有排序功能的对象列表提供排序功能 。可以对排序顺序进行控制(升序,降序)。Collections.sort(List list, Comparator<? super T> c) ,Arrays.sort(T[] a, Comparator<? super T> c)根据指定的比较器排序顺序对指定的列表进行排序。在Comparator比较器中重写int compara(T o1,To2),如果遇到数字的比较,直接在方法内返回两个对象的属性的差值,例如o1.getValue()-o2.getValue() 是升序,o2.getValue()-o1.getValue() 是降序;如果遇到字符形式的比较利用compareTo(T o) 方法进行比较,该方法比较从头开始每一个字符,当前者大于后者返回1,当前者小于后者返回-1。

public class BaseClass {

    private String name;

    private Integer num;

    public BaseClass() {

    }

    public String getName() {
        return name;
    }

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

    public Integer getNum() {
        return num;
    }

    public void setNum(Integer num) {
        this.num = num;
    }
}
public class TestComparator {

    public static void main(String[] args) {
        BaseClass b1 = new BaseClass();
        b1.setName("test12");
        b1.setNum(5);

        BaseClass b2 = new BaseClass();
        b2.setName("tesrr23");
        b2.setNum(9);

        BaseClass b3 = new BaseClass();
        b3.setName("tesy12");
        b3.setNum(6);
        BaseClass b4 = new BaseClass();
        b4.setName("tesk2345");
        b4.setNum(12);
        List<BaseClass> list = new ArrayList<>();
        list.add(b1);
        list.add(b2);
        list.add(b3);
        list.add(b4);
        for (BaseClass baseClass : list) {
            System.out.println(baseClass.getName());
        }
        Collections.sort(list, new Comparator<BaseClass>() {
            @Override
            public int compare(BaseClass o1, BaseClass o2) {
                return o1.getNum()-o2.getNum();
            }
        });

        for (BaseClass baseClass : list) {
            System.out.println(baseClass.getName());
        }

        Collections.sort(list, new Comparator<BaseClass>() {

            @Override
            public int compare(BaseClass o1, BaseClass o2) {
                return o1.getName().compareTo(o2.getName());
            }
        });
        for (BaseClass baseClass : list) {
            System.out.println(baseClass.getName());
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值