Java 比较器Comparable和Comparator的使用和区别

1、Comparable和Comparator介绍

       在java中Intege,Double等基本数据类型和Sting都实现了Comparable接口,不用我们在自己去实现。对于类的比较,需要我们定义比较用到的字段比较逻辑。Comparable是内部比较器需要在类内部实现,Comparator是外部比较器生成比较器对象。

2、使用

(1)类实现Comparable接口重写comparato方法和传的参数进行对比

public class Persion implements Comparable<Persion> {
        private int age;
        private String name;

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

        @Override
        public int compareTo(@NonNull Persion o) {
            if (this.age - o.age == 0)
                return 0;
            else
                return (o.age - this.age) > 0 ? 1 : -1;
        }

        @Override
        public String toString() {
            return "Persion{" +
                    "age=" + age +
                    ", name='" + name + '\'' +
                    '}';
        }
    }

(2)创建一个比较器对象实现Comparator接口重写compara方法,对外部传入的两个类进行比较。

class PersionComparator implements Comparator<Persion> {

        @Override
        public int compare(Persion o1, Persion o2) {
            if (o1.age == o2.age) {
                return 0;
            } else {
                return (o1.age - o2.age) > 0 ? 1 : -1;
            }
        }
    }

两者的区别是实现Comparator接口代码更加灵活,可以定义某个类的多个比较器,从而在排序时根据实际场景自由调用,而Comparable接口实现后便不能改动。

3、比较

List<Persion> list = new ArrayList<>();
        Persion p1 = new Persion(10, "小王");
        Persion p2 = new Persion(12, "小李");
        Persion p3 = new Persion(6, "小张");
        list.add(p1);
        list.add(p2);
        list.add(p3);
        Logger.e("Initiallist:" + list);
        Collections.sort(list);
        Logger.e("Comparablelist:" + list);
        Collections.sort(list, new PersionComparator());
        Logger.e("Comparatorlist:" + list);

输出Initiallist:[Persion{age=10, name='小王'}, Persion{age=12, name='小李'}, Persion{age=6, name='小张'}]

Comparablelist:[Persion{age=12, name='小李'}, Persion{age=10, name='小王'}, Persion{age=6, name='小张'}]

Comparatorlist:[Persion{age=6, name='小张'}, Persion{age=10, name='小王'}, Persion{age=12, name='小李'}]

发布了13 篇原创文章 · 获赞 6 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/old_land/article/details/92795886
今日推荐