如何给一个对象排序
当我们排序的对象不止是简单的数据类型的时候
我们可以通过 实现Comparable 和Comparator 接口来完整对 对象的排序
Comparable和Compartor 的区别?
Comparable 是一个自身已经支持自比较的(如String Integer) 的接口
Comparator 可以说是一个 专用的比较器 当对象本身 不支持自排序和自比较函数的时候
我们可以通过实现Compartor 来比较两对象的大小
Comparable 是一个比较通用的接口 用户可以通过他实现 排序功能
而 Comparator 可以看作一种算法 一种设计模式 (可以看作是一个策略模式 就是不改变对象自身 而用一个策略对象改变对象行为)
Comparable 相对比较固定 与具体类绑定
Comparator 比较灵活 可以与任何需要实现功能的类 绑定
Comparable 可以说是 静态绑定
Comparator 可以说是动态绑定
Comparable
此接口强行对实现它的每个类的对象进行整体排序 此排序被称为该类的自然排序 类的 pareTo 方法被称为它的自然比较方法
实现此接口的对象列表(和数组)可以通过 Collections sort(和 Arrays sort)进行自动排序 实现此接口的对象可以用作有序映射表中的键或有序集合中的元素 无需指定比较器
对于类 C 的每一个 e 和 e 来说 当且仅当 (pareTo((Object)e ) == ) 与 e equals((Object)e ) 具有相同的布尔值时 类 C 的自然排序才叫做与 equals 一致 注意 null 不是任何类的实例 即使 e equals(null) 返回 false pareTo(null) 也会抛出 NullPointerException
强烈推荐(虽然不是必需的)使自然排序与 equals 一致 这是因为在使用其自然排序与 equals 不一致的元素(或键)时 没有显式比较器的有序集合(和有序映射表)行为表现 怪异 尤其是 这样的有序集合(或有序映射表)违背了根据 equals 方法定义的集合(或映射表)的常规协定
而 Comparator
比较函数强行对某些对象 collection 进行整体排序 可以将 Comparator 传递给 sort 方法(如 Collections sort) 从而允许在排序顺序上实现精确控制 还可以使用 Comparator 来控制某些数据结构(如 TreeSet 或 TreeMap)的顺序
当且仅当对于一组元素 S 中的每个 e 和 e 而言 (pare((Object)e (Object)e )== ) 与 e equals((Object)e ) 具有相等的布尔值时 Comparator c 强行对 S 进行的排序才叫做与等号一致 的排序
lishixinzhi/Article/program/Java/hx/201311/26524