|
|
|
|
移动端

1.6 函数对象

《数据结构与算法分析:Java语言描述(原书第3版)》第1章引论,在这一章, 我们阐述本书的目的和目标并简要复习离散数学以及程序设计的一些概念。本节为大家介绍函数对象。

作者:冯舜玺/陈越 译来源:机械工业出版社|2016-04-13 11:18

有奖调研 | 1TB硬盘等你拿 AI+区块链的发展趋势及应用调研


1.6 函数对象

在1.5节我们指出如何编写泛型算法。例如, 图1-16中的泛型方法可以用于找出一个数组中的最大项。

然而, 这种泛型方法有一个重要的局限: 它只对实现Comparable接口的对象有效, 因为它使用compareTo作为所有比较决策的基础。在许多情形下, 这种处理方式是不可行的。例如, 尽管假设Rectangle类实现Comparable接口有些过分, 但即使实现了该接口, 它所具有的compareTo方法恐怕还不是我们想要的方法。例如, 给定一个2×10的矩形和一个5×5的矩形, 哪个是更大的矩形呢?答案恐怕依赖于我们是使用面积还是使用长度来决定。或者, 如果我们试图通过一个开口构造该矩形, 那么或许较大的矩形就是具有较大最小周长的矩形。作为第二个例子, 在一个字符串的数组中如果想要找出最大的串(即字典序排在最后的串), 默认的compareTo不忽略字符的大小写, 则“ZEBRA”按字典序排在“alligator”之前, 这可能不是我们想要的。

上述这些情形的解决方案是重写findMax, 使它接受两个参数: 一个是对象的数组, 另一个是比较函数, 该函数解释如何决定两个对象中哪个大哪个小。实际上, 这些对象不再知道如何比较它们自己; 这些信息从数组的对象中完全去除了。

一种将函数作为参数传递的独创方法是注意到对象既包含数据也包含方法, 24于是我们可以定义一个没有数据而只有一个方法的类, 并传递该类的一个实例。事实上, 一个函数通过将其放在一个对象内部而被传递。这样的对象通常叫作函数对象(funtion object)。

图1-18显示函数对象想法的最简单的实现。findMax的第二个参数是Comparator类型的对象。接口Comparator 在java.util中指定并包含一个compare方法。这个接口在图1-19中指出。

实现接口Comparator<AnyType>类型的任何类都必须要有一个叫作compare的方法, 该方法有两个泛型类型(AnyType)的参数并返回一个int型的量, 遵守和compareTo相同的一般约定。因此, 在图1-18中的第9行对compare的调用可以用来比较数组的项。第4行的带有限制的通配符用来表示如果查找数组中的最大的项, 那么该comparator必须知道如何比较这些项, 或者这些项的超类型的那些对象。我们可以在第26行看到, 为了使用这种版本的findMax,  findMax通过传递一个String数组25以及一个实现comparator<String>的对象而被调用。这个对象属于CaseInsensitiveCompare类型, 它是我们编写的一个类。

在第4章我们将给出关于一个类的例子, 这个类需要将它存储的项排序。我们将利用Comparable编写大部分的代码, 并指出其中需要使用函数对象的改动部分。在本书的其他地方, 我们将避免函数对象的细节以使得代码尽可能地简单, 我们知道以后将函数对象添加进去并不困难。

喜欢的朋友可以添加我们的微信账号:

51CTO读书频道二维码


51CTO读书频道活动讨论群:342347198

【责任编辑:book TEL:(010)68476606】

回书目   上一节   下一节
点赞 0
分享:
大家都在看
猜你喜欢

读 书 +更多

用户体验要素

本书是AJAX之父的经典之作。本书用简洁的语言系统化地诠释了设计、技术和商业融合是最重要的发展趋势。全书共8章,包括关于用户体验以及为...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊