Comparable与Comparator的使用场景比较

  • *1.果这个对象, 在项目中大多数的情况下, 都采用相同的大小比较的方式。 比如: 一个Person类, 在大多数情况下, 都是按照年龄进行大小比较的。 此时就可以让Person类实现Comparable接口。

  • *2.如果某一个类的对象, 在临时进行大小比较的时候, 使用的与默认的比较不一样的规则。 比如: 一个Person类, 大多数情况下, 都是使用的年龄进行大小比较的, 但是临时需要使用身高进行一次比较, 此时就可以使用 Comparator 临时完成了。 而且, Comparator的优先级要高于Comparable。

  • 具体实现,看下边代码。核心是comparable的compareTo方法跟TreeSet的实例化后边的lambda表达式部分。

  • Person类

  • Person实现Comparable接口,实现比较。

  • package day0707.genericParadigm;
    
    import java.util.TreeSet;
    
    public class TreeSetUsage1 {
        public static void main(String[] args) {
            //1.实例化一个TreeSet对象
            TreeSet sets=new TreeSet<>();
    
            sets.add(new Person("xiaoming",10,100,165,50));
            sets.add(new Person("xiaohong", 11, 99, 164, 50));
            sets.add(new Person("xiaolan", 9, 98, 164, 51));
            sets.add(new Person("xiaolv", 8, 98, 166, 48));
            sets.add(new Person("xiaozi", 10, 97, 159, 46));
            //2.遍历集合
            sets.forEach(System.out::println);
            System.out.println(sets.size());
        }
    }
    class Person implements Comparable{
        String name;
        int age;
        int score;
        int height;
        int weight;
    
        public Person(String name, int age, int score, int height, int weight) {
            this.name = name;
            this.age = age;
            this.score = score;
            this.height = height;
            this.weight = weight;
        }
    
        @Override
        public String toString() {
            return "Person{" +
                    "name='" + name + '\'' +
                    ", age=" + age +
                    ", score=" + score +
                    ", height=" + height +
                    ", weight=" + weight +
                    '}';
        }
    
        /**
         * 制定了大小比较的规则
         * @param o 和this进行比较的Person独享
         * @return 比较结果
         *      > 0 : this > o
         *     == 0 : this == o
         *      < 0 : this < o
         */
        @Override
        public int compareTo(Person o) {
            //按照年龄从小到大排序
            return this.age-o.age;
        }
    }
  • Person类使用Comparator接口实现临时的比较
  • 下边的p.height可以换成age,score,weight,改变比较规则.
  • package day0707.genericParadigm;
    
    import java.util.TreeSet;
    
    public class TreeSetUsage2 {
        public static void main(String[] args) {
            //1.实例化一个TreeSet对象
            //  可以通过Comparator进行TreeSet的实例化。使用指定的规则进行大小比较
            //  此时,集合中存储的元素可以不是先Comparable接口
            TreeSet sets=new TreeSet<>((p1,p2)->p1.height-p2.height);
            sets.add(new Person("xiaoming", 10, 100, 165, 50));
            sets.add(new Person("xiaohong", 11, 99, 164, 50));
            sets.add(new Person("xiaolan", 9, 98, 164, 51));
            sets.add(new Person("xiaolv", 8, 98, 166, 48));
            sets.add(new Person("xiaozi", 10, 97, 159, 46));
            //2.遍历集合
            sets.forEach(System.out::println);
            System.out.println(sets.size());
        }
    }

你可能感兴趣的:(intellij,idea,java)