快速业务通道

深入理解Collections API - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-23
s 中的键的对象来说,更是如此。如果你对这些 对象集 中的元素或键做了更改,这些 对象集 将中断。

构造函数可检查它的参数是否为 null。这可以保证所有的Name 对象都能很好地形成。因而没有其它方法会扔出NullPointerException.

hashCode 方法被重新定义。对重新定义 equals 方法的任意类来说,这是必需的(essential)。一般约定(general contract)需要 Object.equals. (Equal 对象必须具有相等的哈希代码) 。

如果特定对象为 null,或一个不适当的类型, equals 方法则返回 false。在这种情况下, compareTo 方法扔出一个运行时异常。这两个行为都是各自方法的一般约定所必需的。

toString 方法已被重新定义,从而可以以人们能够读懂的形式打印 Name 。这总是一个好主意,特别是对要被放入对象集 中的对象来说,更有益处。各种 对象集 类型的 toString 方法依赖它们的元素、键和值的 toString 方法。

由于这一节介绍的是有关元素排序的问题,因而让我们稍微多谈一点 Name 的 compareTo 方法。它实现标准的姓名-排序算法,在该算法中,last name 优先于 first name。这恰恰是你在一个natural ordering(自然排序)中所想要的。如果自然排序不自然,那才容易引起混乱呢!

请看 compareTo 是如何被实现的,因为它是相当典型的。首先,你将 Object 参数转换为适当类型; 如果参数类型是不适当的,则会扔出一个适当的异常(ClassCastException);那么你应该比较对象的最重要部分(在此案例中为 last name)。通常,你可以使用该部分的类型的自然排序。在次案例中,该部分是一个 String, 并且自然的(按词典顺序的)排序正是所要求的。如果比较的结果是空(它表示等同性)之外的其它东西,你就做完了:你可以返回结果。如果最重要的部分是相等的,你就应该继续比较次重要部分。在此案例中,只有两个部分 (first name and last name)。如果有更多的部分,你就应该以显而易见的方式继续进行,直到发现两个不相等的部分(否则你就应该比较最不重要的部分),这时,你就可以返回比较结果了。这是 一个建立 Name 对象列表并对它们进行排序的小程序:

import java.util.*; class NameSort { public static void main(String args[]) { Name n[] = { new Name("John", "Lennon"), new Name("Karl", "Marx"), new Name("Groucho", "Marx"), new Name("Oscar", "Grouch") }; List l = Arrays.asList(n); Collections.sort(l); System.out.println(l); } }

如果你运行这个程序,以下是它所打印的结果:

[Oscar Grouch, John Lennon, Groucho Marx, Karl Marx]对 compareTo 方法的行为有四个限制,我们现在不作一一讨论,因为它们的技术性太强,并且十分枯燥,我们最好将其留在API文本中。但是,所有实现 Comparable 的类都必须接受这些限制的约束,这一点是确实重要的。因此,如果你要编写一个实现Comparable 的类,请读那些有关 Comparable 的文本吧。要试图为违反了那些限制的对象的列表进行排序可能引发不可预知的行为。从技术上讲,这些限制保证了自然排序是实现它的类的对象的部分顺序(partial order)。保证排序被很好地定义是十分必要的。

深入理解Collections API(3)

时间:2010-12-13

比较器(Comparators)

好,到目前为止,你已经了解了自然排序。那么,如果要对某些对象不按自然顺序进行排序,又会怎么样呢?或者,如果你要为某些不实现 Comparable 的对象进行排序呢?为做这些事情,你需要提供一个Comparator。Comparator 实际就是一个封装了排序的对象。与 Comparable 接口类似,Comparator 接口由一个的方法构成:

public int

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号