• java Comparable 和 Comparator接口区别


    Comparable 简介

    Comparable 是排序接口。

    若一个类实现了Comparable接口,就意味着“该类支持排序”。  即然实现Comparable接口的类支持排序,假设现在存在“实现Comparable接口的类的对象的List列表(或数组)”,则该List列表(或数组)可以通过 Collections.sort(或 Arrays.sort)进行排序。

    此外,“实现Comparable接口的类的对象”可以用作“有序映射(如TreeMap)”中的键或“有序集合(TreeSet)”中的元素,而不需要指定比较器。

    Comparable 定义

    Comparable 接口仅仅只包括一个函数,它的定义如下:

    package java.lang;
    import java.util.*;
    
    public interface Comparable<T> {
        public int compareTo(T o);
    }

    说明:
    假设我们通过 x.compareTo(y) 来“比较x和y的大小”。若返回“负数”,意味着“x比y小”;返回“零”,意味着“x等于y”;返回“正数”,意味着“x大于y”。

    Comparator 简介

    Comparator 是比较器接口。

    我们若需要控制某个类的次序,而该类本身不支持排序(即没有实现Comparable接口);那么,我们可以建立一个“该类的比较器”来进行排序。这个“比较器”只需要实现Comparator接口即可。

    也就是说,我们可以通过“实现Comparator类来新建一个比较器”,然后通过该比较器对类进行排序。

    Comparator 定义

    Comparator 接口仅仅只包括两个个函数,它的定义如下:

    复制代码
    package java.util;
    
    public interface Comparator<T> {
    
        int compare(T o1, T o2);
    
        boolean equals(Object obj);
    }
    复制代码

    说明:
    (01) 若一个类要实现Comparator接口:它一定要实现compareTo(T o1, T o2) 函数,但可以不实现 equals(Object obj) 函数。

            为什么可以不实现 equals(Object obj) 函数呢? 因为任何类,默认都是已经实现了equals(Object obj)的。 Java中的一切类都是继承于java.lang.Object,在Object.java中实现了equals(Object obj)函数;所以,其它所有的类也相当于都实现了该函数。

    (02) int compare(T o1, T o2) 是“比较o1和o2的大小”。返回“负数”,意味着“o1比o2小”;返回“零”,意味着“o1等于o2”;返回“正数”,意味着“o1大于o2”。

    Comparator 和 Comparable 比较

    Comparable是排序接口;若一个类实现了Comparable接口,就意味着“该类支持排序”。
    而Comparator是比较器;我们若需要控制某个类的次序,可以建立一个“该类的比较器”来进行排序。

    我们不难发现:Comparable相当于“内部比较器”,而Comparator相当于“外部比较器”。

    例子:

    public class CompareComparatorAndComparableTest {
        public static void main(String [] args) {
            ArrayList<Person> list = new ArrayList<Person>();
            list.add(new Person("cccc",20));
            list.add(new Person("dssdfj",30));
            list.add(new Person("vvv",10));
            list.add(new Person("ssss",50));
        
            System.out.println("original sort: list " + list);
            Collections.sort(list);
            System.out.println("after sort list by name : " + list);
            
            Collections.sort(list,new AscAgeComparator());
            System.out.println("after asc_sort by age: " + list);
            
            Collections.sort(list,new DscAgeComparator());
            System.out.println("after dsc_sort by age: " + list);
        }
    }
    
    
    class Person implements Comparable<Person>{
        int age;
        String name;
        public Person() {
            age = 0;
            name = "";
        }
        
        public Person(String name,int age) {
            this.age = age;
            this.name = name;
        }
        
        public int getAge() {
            return age;
        }
        
        public String getName() {
            return name;
        }
        
        @Override
        public String toString() {
            // TODO Auto-generated method stub
            return name + ": " + age;
        }
    
        @Override
        public int compareTo(Person o) {
            
            return name.compareTo(o.name);
        }
    }
    
    
    class AscAgeComparator implements Comparator<Person>{
    
        @Override
        public int compare(Person o1, Person o2) {
            // TODO Auto-generated method stub
            return o1.age - o2.age;
        }
    }
    
    class DscAgeComparator implements Comparator<Person>{
    
        @Override
        public int compare(Person o1, Person o2) {
            // TODO Auto-generated method stub
            return o2.age - o1.age;
        }
        
    }

  • 相关阅读:
    数据结构:排序(1)
    日语分类系列:05
    数据结构:图(2)
    日语分类系列:04
    数据结构:图(1)
    日语分类系列:03
    数据结构:树
    django-restframework view中的内容
    django-restframework serializers文件的内容
    django-restframework settings 内设置及功能
  • 原文地址:https://www.cnblogs.com/zquan/p/9374595.html
Copyright © 2020-2023  润新知