JAVA 对象类型比较

115 阅读2分钟

背景

在工作中我们往往要对列表中的对象根据某一些字段进行排序,本文就对Java中如何实现排序进行一个简单的介绍。

实现排序的方法

想要通过对象进行排序,核心是先要实现内置的Comparable接口,或者是自定义的排序方法。

@Data
@ToString
public class Person implements Comparable<Person> {
    /**
     *  姓名
     */
    private String name;
    /**
     * 生日
     */
    private Long birthday;


    public static void main(String[] args) {
        List<Person> list = new ArrayList<>();
        Person p1 = new Person();
        p1.setBirthday(177722388923L);
        p1.setName("张三");
        Person p2 = new Person();
        p2.setBirthday(132722388923L);
        p2.setName("李四");

        list.add(p1);
        list.add(p2);

       // 1. 使用stream流进行排序
        List<Person> collect = list.stream().sorted().collect(Collectors.toList());
        for (Person person : collect) {
            System.out.println(person);
        }
        // 2. 使用java.util.Collections工具类进行排序
        Collections.sort(list);
        list.stream().forEach(System.out::println);
        ```
        /**
         * 3. 自定义排序方法,通过Collection.sort进行排序
         */
        Collections.sort(list,Person::compareByDateAsc);
        list.forEach(System.out::println);
        ```
    }

    /**
     *  默认比较是升序,倒着比较是降序
     * @param o
     * @return
     */
    @Override
    public int compareTo(@NotNull Person o) {
        Long target = o.getBirthday();
        Long we = this.getBirthday();
        return target.compareTo(we);
    }
    /**
    * 自定义排序方法
    */
    public int compareByDateAsc(Person target){
        return this.getBirthday().compareTo(target.getBirthday());
    }
}

我们通过要比较的对象实现Comparable接口,然后重写compareTo方法即可实现排序。

数据并不规范时

我们对列表中数据排序往往会遇到一个问题:那就是要排序的字段并不规范!我们在获取出来的时候直接比较可能会发生异常。 比如以下的列表数据:

@Data
@ToString
public class PersonDemo2 implements Comparable<PersonDemo2> {
    /**
     *  姓名
     */
    private String name;
    /**
     * 生日
     */
    private String birthday;


    public static void main(String[] args) {
        /**
         *  我们期望的birthday字段中存放的就是long类型,当时实际上可能会存在其他如null,"null"等类型的数据,直接进行比较的话程序会报出错误
         */
        List<PersonDemo2> list = new ArrayList<>();
        PersonDemo2 p1 = new PersonDemo2();
        p1.setBirthday(null);
        p1.setName("张三");
        PersonDemo2 p2 = new PersonDemo2();
        p2.setBirthday("132722388923");
        p2.setName("李四");

        PersonDemo2 p3 = new PersonDemo2();
        p3.setBirthday("null");
        p3.setName("王五");

        PersonDemo2 p4 = new PersonDemo2();
        p4.setBirthday("未知");
        p4.setName("赵六");


        list.add(p1);
        list.add(p2);
        list.add(p3);
        list.add(p4);

        Collections.sort(list);
        list.forEach(System.out::println);
    }

    /**
     *  默认比较是升序,倒着比较是降序
     * @param target
     * @return
     */
    @Override
    public int compareTo(@NotNull PersonDemo2 target) {
        Long l1;
        Long l2;
        try {
            l1 = Long.parseLong(target.getBirthday());
        }catch (Exception e){
            System.out.println("转换发生异常:"+target.getBirthday());
            l1 = 0L;
        }
        try {
            l2 = Long.parseLong(this.getBirthday());
        }catch (Exception e){
            l2 = 0L;
            System.out.println("转换发生异常:"+this.getBirthday());

        }
        return l2.compareTo(l1);
    }

}

可以通过异常处理的方式来捕获,然后将数据转换为需要的格式以后,再进行转换。