a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 135|回复: 0

[专业语言] JAVA认证:怎样给一个对象排序

[复制链接]
发表于 2012-8-4 12:44:44 | 显示全部楼层 |阅读模式
当我们排序的对象不止是简单的数据类型的时候
5 ^. j1 u8 c9 O) r! c  我们可以通过 实现Comparable 和Comparator 接口来完整对 对象的排序
. H3 U( V2 Y6 c, J4 s# z  Comparable和Compartor 的区别?
% m# `  J* ?0 |  Comparable 是一个自身已经支持自比较的(如String ,Integer) 的接口4 v0 P8 R4 o+ I8 F, u# I2 p9 H* g
  Comparator 可以说是一个 专用的比较器 当对象本身 不支持自排序和自比较函数的时候
7 X$ g! h  r  a. ]  R' ]- ?  我们可以通过实现Compartor 来比较两对象的大小
5 g" v: @" [% X8 m, x# |  Comparable 是一个比较通用的接口 用户可以通过他实现 排序功能
* |+ S+ g% K9 v  而 Comparator 可以看作一种算法 一种设计模式 (可以看作是一个策略模式 就是不改变对象自身,而用一个策略对象改变对象行为)5 f; q3 V- M# m; J
  Comparable 相对比较固定 与具体类绑定 ,; @* k; t* T3 g- X6 q  E
  Comparator 比较灵活 可以与任何需要实现功能的类 绑定
. y& d  K8 N" t9 T8 a) Z  Comparable 可以说是 静态绑定( `3 S$ h& l! @. G- p5 _5 Q$ S- B! y
  Comparator 可以说是动态绑定
# X9 C- r" |/ D  Comparable
& f* x' ^: [- a3 z2 ]( l1 r  此接口强行对实现它的每个类的对象进行整体排序。此排序被称为该类的自然排序,类的 compareTo 方法被称为它的自然比较方法。
7 u( \, T) g" i% v# z5 g9 c5 V9 |  实现此接口的对象列表(和数组)可以通过 Collections.sort(和 Arrays.sort)进行自动排序。实现此接口的对象可以用作有序映射表中的键或有序集合中的元素,无需指定比较器。9 Y0 ^$ Z: h" e2 Q6 i; `1 H" O
  对于类 C 的每一个 e1 和 e2 来说,当且仅当 (e1.compareTo((Object)e2) == 0) 与 e1.equals((Object)e2) 具有相同的布尔值时,类 C 的自然排序才叫做与 equals 一致。注意,null 不是任何类的实例,即使 e.equals(null) 返回 false,e.compareTo(null) 也会抛出 NullPointerException。
* E: B1 H) j, \/ ^9 J' H  强烈推荐(虽然不是必需的)使自然排序与 equals 一致。这是因为在使用其自然排序与 equals 不一致的元素(或键)时,没有显式比较器的有序集合(和有序映射表)行为表现“怪异”。尤其是,这样的有序集合(或有序映射表)违背了根据 equals 方法定义的集合(或映射表)的常规协定。
4 v; C. U+ V% J. q9 G. C  而 Comparator
: v" Q& w8 s6 c% \/ b  比较函数强行对某些对象 collection 进行整体排序。可以将 Comparator 传递给 sort 方法(如 Collections.sort),从而允许在排序顺序上实现精确控制。还可以使用 Comparator 来控制某些数据结构(如 TreeSet 或 TreeMap)的顺序。
1 R; O# [: F" W  当且仅当对于一组元素 S 中的每个 e1 和 e2 而言,(compare((Object)e1, (Object)e2)==0) 与 e1.equals((Object)e2) 具有相等的布尔值时,Comparator c 强行对 S 进行的排序才叫做与等号一致 的排序。
5 f1 C% U2 G( n# Y! O  ~& C  当使用具有与等号一致的强行排序能力的 comparator 对有序 set(或有序映射)进行排序时,应该小心谨慎。假定一个带有显式 Comparator c 的有序 set(或有序映射)与从 set S 中抽取出来的元素(或键)一起使用。如果 c 强行对 S 进行的排序与等号一致,那么有序 set(或有序映射)将是行为“怪异的”。尤其是那些将违背根据 equals 所定义 set(或映射)的常规协定的有序 set(或有序映射)。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Woexam.Com ( 湘ICP备18023104号 )

GMT+8, 2024-5-4 01:33 , Processed in 0.279859 second(s), 21 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表