美文网首页
Comparable接口和Comparator接口的使用和区别

Comparable接口和Comparator接口的使用和区别

作者: 木木点 | 来源:发表于2020-05-07 22:06 被阅读0次

Comparable接口实现排序

public interface Comparable<T>

Comparable是对实现了该接口的类的所有对象进行排序

举个栗子

class Person implements Comparable<Person> {
    private String name;
    private int age;
    @Override
    public int compareTo(Person o) {
        //这里是对Person类的对象间年龄进行比较,升序
        return this.getAge() - o.getAge();
    }
    ……
    }

测试代码

public class Test {
    public static void main(String[] args) {
        TreeSet<Person> persons = new TreeSet<Person>() {
            {
                add(new Person("张三", 11));
                add(new Person("李四", 8));
                add(new Person("王五", 18));
            }
        };
        System.out.println(persons);
    }
}

输出结果

[Person{name='李四', age=8}, Person{name='张三', age=11}, Person{name='王五', age=18}]

Comparator接口实现排序

public interface Comparator<T>

对任意类型集合对象进行整体排序,排序时将此接口的实现传递给Collections.sort方法或者Arrays.sort方法排序。

实现int compare(T o1, T o2);方法,返回正数,零,负数各代表大于,等于,小于。

举个栗子

List<Person> personList = new ArrayList<Person>() {
            {
                add(new Person("张三", 11));
                add(new Person("李四", 8));
                add(new Person("王五", 18));
            }
        };

        //按年龄进行排序
        Collections.sort(personList, new Comparator<Person>() {
            @Override
            public int compare(Person o1, Person o2) {
                //升序
                return o1.getAge() - o2.getAge();


                //降序
//                return o2.getAge() - o1.getAge();

            }
        });
        System.out.println(personList);

或者也可以通过实现的方式使用Comparator接口

class Person implements Comparator<Person> {
    private String name;
    private int age;

    @Override
    public int compare(Person o1, Person o2) {
        return o1.getAge()-o2.getAge();
    }
    ……
    }

Comparable接口和Comparator接口的区别

  1. Comparable接口位于java.lang包下;Comparator位于java.util包下
  2. Comparable接口只提供了一个compareTo()方法;Comparator接口不仅提供了compara()方法,还提供了其他默认方法,如reversed()、thenComparing(),使我们可以按照更多的方式进行排序
  3. 如果要用Comparable接口,则必须实现这个接口,并重写comparaTo()方法;但是Comparator接口可以在类外部使用,通过将该接口的一个匿名类对象当做参数传递给Collections.sort()方法或者Arrays.sort()方法实现排序。Comparator体现了一种策略模式,即可以不用要把比较方法嵌入到类中,而是可以单独在类外部使用,这样我们就可有不用改变类本身的代码而实现对类对象进行排序。

相关文章

网友评论

      本文标题:Comparable接口和Comparator接口的使用和区别

      本文链接:https://www.haomeiwen.com/subject/vtftnhtx.html