《数据结构与抽象:Java语言描述(原书第4版)》一1.3 使用ADT包

简介:

本节书摘来华章计算机《数据结构与抽象:Java语言描述(原书第4版)》一书中的第1章 ,第1.3节,[美]弗兰克M.卡拉诺(Frank M. Carrano) 蒂莫西M.亨利(Timothy M. Henry) 著 罗得岛大学  新英格兰理工学院 辛运帏 饶一梅 译 更多章节内容可以访问云栖社区“华章计算机”公众号查看。

1.3 使用ADT包

假定我们雇用一名程序员使用Java实现ADT包,给定到目前为止已有的接口和规格说明。如果假定这些规格说明已经足够清楚能让程序员完成相关的实现,那么我们可以在程序中使用这些ADT操作而不需要知道实现的细节。即,我们不需要知道程序员如何实现这个包,也能使用这个包。我们只需知道ADT包做什么就可以了。本节假定已经有了一个Java类Bag,它实现了程序清单1-1给出的Java接口BagInterface。简单的例子说明我们如何使用Bag。
在程序清单1-2的第13行,注意一旦我们选择了包中对象的数据类型(本例中是Item),这个数据类型就包含在接口名后面的尖括号中。还要注意类名后面的空尖括号。包中的所有项必须是这个数据类型或这个数据类型的子类型。编译程序强制我们遵守这条约定。如果是基本数据类型,则可以将对应的包装类的实例放入包中。例如,不是使用基本数据类型int的实例,而是使用包装类Integer的实例。

示例:在线购物。当在线购物时,你挑选的商品保存在购物车或购物袋内,直到你准备去结账为止。实现购物网站的程序可以使用类Bag来维护购物车。毕竟,你挑选的购买物品的次序是不重要的。程序清单1-2显示这样一个程序的简单示例。

程序清单1-2 在线购物中购物袋的维护程序
image
image

为使示例简单,我们创建Item对象的数组来表示购物者挑选的商品。类Item可在本书的在线资源中找到,它定义了用来描述商品及价格的数据域,还定义了这些域的访问方法及toString方法。
初始时,我们使用Bag的默认构造方法创建Item对象的空包。注意,shoppingCart的数据类型是BagInterface。这个声明要求shoppingCart仅能调用声明在BagInterface中的方法。另外,我们可以用实现BagInterface的其他类来替换Bag,而不需要修改程序中后续的语句。
注意将挑选的商品添加到包中的循环,及结账时一次删除它们中的一个的循环。

自测题7 在前面的例子中,在结账过程中执行while循环,直到包是空的时为止。可用什么样的for语句来替换这个while语句?只根据shoppingCart的存在与否来写,而不是数组items。
示例:扑满。你或许有一个扑满、存钱罐,或者其他某个容器来存放你剩下的硬币。扑满装硬币,但并不组织它们。而扑满中肯定有重复的硬币。扑满好像一个包,但更简单,因为它仅有3个操作:可以将一个硬币添加到扑满中、删除一个(摇晃扑满,所以没办法控制哪个硬币掉下来),或者看看扑满是否为空。

假定你有表示硬币的类Coin,我们可以创建程序清单1-3中给出的类PiggyBank。PiggyBank对象将硬币保存在包中,即,保存在实现了接口BagInterface的类的实例中。PiggyBank的add、remove和isEmpty方法分别调用包方法来得到各自的结果。类PiggyBank是适配器类的一个示例。关于适配器类详见附录D。
程序清单1-3 扑满的类
image
image

程序清单1-4提供了类PiggyBank的主要示例。程序将一些硬币添加到扑满中,然后再删除所有的硬币。因为程序没有记录添加到扑满中的硬币,所以没办法控制删除哪个硬币。虽然输出的内容表示从扑满中拿走硬币的次序与它们放入扑满中的次序相反,但这个次序依赖于包的实现。我们在下一章将考虑这些实现。
注意,除了main方法外,程序定义了另一个方法addCoin。因为main是静态的且调用addCoin,所以addCoin也必须是静态的。方法addCoin接收的参数是一个Coin对象和一个PiggyBank对象。然后该方法将硬币添加到扑满中。
程序清单1-4 类PiggyBank的示例
image
image

注:方法可以改变作为参数传给它的对象的状态

将两个参数传给方法addCoin:一个硬币和一个扑满。这两个参数都是main方法中已存在的对象的引用。方法addCoin保存参数中这些引用的副本,你应该记得,它们的行为像局部变量。虽然addCoin不能改变引用,但因为它们已存在于main方法中,所以它能改变所指对象的状态。具体来说,它能通过向扑满中添加硬币来修改扑满(即PiggyBank对象)。记住,这个扑满只局部于main,且在addCoin的外面。

注:一旦在下一章实现了包类,你就能实际运行前一个程序清单中给出的程序。你只需要将类名Bag替换为下一章中的示例使用的一个类名即可。

自测题8 考虑程序清单1-4中的程序。在创建类PiggyBank的实例myBank后,假定将几个未知硬币添加到myBank中。写代码,从扑满中删除硬币,直到或者删除一分钱硬币,或者扑满为空时为止。

相关文章
|
4月前
|
JSON Java API
【干货满满】分享京东API接口到手价,用Java语言实现
本示例使用 Java 调用京东开放平台商品价格及优惠信息 API,通过商品详情和促销接口获取到手价(含优惠券、满减等),包含签名生成、HTTP 请求及响应解析逻辑,适用于比价工具、电商系统集成等场景。
|
2月前
|
Java
Java语言实现字母大小写转换的方法
Java提供了多种灵活的方法来处理字符串中的字母大小写转换。根据具体需求,可以选择适合的方法来实现。在大多数情况下,使用 String类或 Character类的方法已经足够。但是,在需要更复杂的逻辑或处理非常规字符集时,可以通过字符流或手动遍历字符串来实现更精细的控制。
282 18
|
2月前
|
存储 Java 索引
用Java语言实现一个自定义的ArrayList类
自定义MyArrayList类模拟Java ArrayList核心功能,支持泛型、动态扩容(1.5倍)、增删改查及越界检查,底层用Object数组实现,适合学习动态数组原理。
124 4
|
3月前
|
存储 Java Apache
Java语言操作INI配置文件策略
以上步骤展示了基本策略,在实际项目中可能需要根据具体需求进行调整优化。例如,在多线程环境中操作同一份配置时需要考虑线程安全问题;大型项目可能还需考虑性能问题等等。
198 15
|
5月前
|
监控 Java API
Java语言按文件创建日期排序及获取最新文件的技术
这段代码实现了文件创建时间的读取、文件列表的获取与排序以及获取最新文件的需求。它具备良好的效率和可读性,对于绝大多数处理文件属性相关的需求来说足够健壮。在实际应用中,根据具体情况,可能还需要进一步处理如访问权限不足、文件系统不支持某些属性等边界情况。
291 14
|
4月前
|
算法 Java
Java语言实现链表反转的方法
这种反转方法不需要使用额外的存储空间,因此空间复杂度为,它只需要遍历一次链表,所以时间复杂度为,其中为链表的长度。这使得这种反转链表的方法既高效又实用。
451 0
|
4月前
|
JSON Java API
【干货满满】分享拼多多API接口到手价,用Java语言实现
本方案基于 Java 实现调用拼多多开放平台商品详情 API,通过联盟接口获取商品到手价(含拼团折扣与优惠券),包含签名生成、HTTP 请求及响应解析逻辑,适用于电商比价、导购系统集成。
|
4月前
|
JSON Java API
【干货满满】分享淘宝API接口到手价,用Java语言实现
本文介绍了如何使用 Java 调用淘宝开放平台 API 获取商品到手价,涵盖依赖配置、签名生成、HTTP 请求与响应解析等核心实现步骤。
|
5月前
|
JavaScript Java Go
Go、Node.js、Python、PHP、Java五种语言的直播推流RTMP协议技术实施方案和思路-优雅草卓伊凡
Go、Node.js、Python、PHP、Java五种语言的直播推流RTMP协议技术实施方案和思路-优雅草卓伊凡
412 0
|
5月前
|
JSON JavaScript 前端开发
Python+JAVA+PHP语言,苏宁商品详情API
调用苏宁商品详情API,可通过HTTP/HTTPS发送请求并解析响应数据,支持多种编程语言,如JavaScript、Java、PHP、C#、Ruby等。核心步骤包括构造请求URL、发送GET/POST请求及解析JSON/XML响应。不同语言示例展示了如何获取商品名称与价格等信息,实际使用时请参考苏宁开放平台最新文档以确保兼容性。

热门文章

最新文章