《数据结构与抽象:Java语言描述(原书第4版)》一练习
本節(jié)書(shū)摘來(lái)華章計(jì)算機(jī)《數(shù)據(jù)結(jié)構(gòu)與抽象:Java語(yǔ)言描述(原書(shū)第4版)》一書(shū)中的第2章 ,[美]弗蘭克M.卡拉諾(Frank M. Carrano) 蒂莫西M.亨利(Timothy M. Henry) 著 羅得島大學(xué) 新英格蘭理工學(xué)院 辛運(yùn)幃 饒一梅 譯 更多章節(jié)內(nèi)容可以訪問(wèn)云棲社區(qū)“華章計(jì)算機(jī)”公眾號(hào)查看。
練習(xí)
1.為什么類ArrayBag中的方法getIndexOf和removeEntry是私有的而不是公有的?
2.為ADT包實(shí)現(xiàn)方法replace,用一個(gè)給定對(duì)象替換當(dāng)前包中的對(duì)象,并返回原始對(duì)象。
3.修改2.1.7節(jié)中給出的方法clear的定義,以便更有效率且僅調(diào)用checkInitialization方法。
4.修改2.1.7節(jié)的避免重復(fù)工作中給出的方法remove,以便從包中刪除一個(gè)隨機(jī)項(xiàng)。這個(gè)修改會(huì)影響到類ArrayBag中的其他方法嗎?
5.為類ArrayBag定義方法removeEvery,從包中刪除給定項(xiàng)的所有出現(xiàn)。
6.類ArrayBag的實(shí)例有固定大小,而ResizableArrayBag的實(shí)例則沒(méi)有。給出一些例子,如果包的大小是
a.固定的
b.可變的
則包是合適的。
7.假定想定義類PileOfBooks來(lái)實(shí)現(xiàn)前一章項(xiàng)目2中描述的接口。包是表示一堆書(shū)的合理集合嗎?解釋之。
8.考慮2.2.2節(jié)中討論的類ResizableArrayBag的實(shí)例myBag。假定myBag的初始容量是10。
a.向myBag中添加了145項(xiàng)后
b.向myBag中添加20項(xiàng)后
數(shù)組bag的長(zhǎng)度是多少?
9.在客戶層定義一個(gè)方法,其參數(shù)是類ArrayBag的實(shí)例,并返回類ResizableArrayBag的實(shí)例,其中含有與參數(shù)所給包中相同的項(xiàng)。
10.假定包中含有Comparable對(duì)象,例如字符串。一個(gè)Comparable對(duì)象屬于實(shí)現(xiàn)了標(biāo)準(zhǔn)接口Comparable的一個(gè)類,所以有方法compareTo。為類ArrayBag實(shí)現(xiàn)下列方法:
- 返回包中最小對(duì)象的方法getMin
- 返回包中最大對(duì)象的方法getMax
- 刪除并返回包中最小對(duì)象的方法removeMin
- 刪除并返回包中最大對(duì)象的方法removeMax
11.假定包中含有Comparable對(duì)象,如前一個(gè)練習(xí)中所描述的那樣。為類ArrayBag定義一個(gè)方法,返回由小于某個(gè)給定項(xiàng)的項(xiàng)組成的新包。方法的頭可以如下所示:
確保你的方法不會(huì)影響原始包的狀態(tài)。
12.為類ArrayBag定義equals方法,當(dāng)兩個(gè)包的內(nèi)容相同時(shí)返回真。注意,兩個(gè)相等的包應(yīng)含有相同個(gè)數(shù)的項(xiàng),每個(gè)項(xiàng)出現(xiàn)在每個(gè)包中的個(gè)數(shù)應(yīng)相等。每個(gè)數(shù)組中的項(xiàng)的次序是無(wú)關(guān)的。
13.類ResizableArrayBag有一個(gè)數(shù)組,當(dāng)向包中添加對(duì)象時(shí)其大小增大。修改這個(gè)類,使得當(dāng)從包中刪除對(duì)象時(shí),它的數(shù)組還可以縮小。完成這個(gè)任務(wù)需要兩個(gè)新的私有方法,如下所示:
第一個(gè)新方法檢查是否應(yīng)該減小數(shù)組的大小:
如果包中的項(xiàng)數(shù)小于數(shù)組大小的一半且數(shù)組的大小大于20,這個(gè)方法返回真。
第二個(gè)新方法創(chuàng)建一個(gè)新數(shù)組,其大小是當(dāng)前數(shù)組大小的3/4,且數(shù)組的大小大于20。
實(shí)現(xiàn)這兩個(gè)方法,然后使用它們來(lái)定義兩個(gè)remove方法。
14.考慮前一個(gè)練習(xí)中描述的兩個(gè)私有方法。
15.為類ResizableArrayBag定義前一章練習(xí)5描述的方法union。
16.為類ResizableArrayBag定義前一章練習(xí)6描述的方法intersection。
17.為類ResizableArrayBag定義前一章練習(xí)7描述的方法difference。
項(xiàng)目
1.設(shè)計(jì)并實(shí)現(xiàn)單人猜謎游戲,選擇n個(gè)1~m之間的隨機(jī)整數(shù),要求用戶來(lái)猜它們。同一個(gè)整數(shù)可能被選中多次。例如,游戲可能選中1~10之間的以下4個(gè)整數(shù):4,6,1,6。用戶和游戲之間的交互可能是:
輸入你猜測(cè)的1~10之間選中的4個(gè)整數(shù):
1 2 3 4
你猜的2是正確的,再猜。
輸入你猜測(cè)的1~10之間選中的4個(gè)整數(shù):
2 4 6 8
你猜的2是正確的,再猜。
1 4 6 6
正確!再玩一次?不
再見(jiàn)!
設(shè)計(jì)作為ADT的游戲。使用包來(lái)保存游戲選擇的整數(shù)。整數(shù)m和n由客戶指定。
2.定義一個(gè)表示1.5節(jié)描述的集合(set)并實(shí)現(xiàn)接口的類ArraySet。在實(shí)現(xiàn)中使用類ResizableArrayBag。然后寫(xiě)一個(gè)程序,充分論證你的實(shí)現(xiàn)。
3.重復(fù)前一個(gè)項(xiàng)目,使用可變大小的數(shù)組而不是使用類ResizableArrayBag。
4.定義類PileOfBooks,實(shí)現(xiàn)前一章項(xiàng)目2中描述的接口。在實(shí)現(xiàn)中使用可變大小的數(shù)組。然后寫(xiě)一個(gè)程序,充分論證你的實(shí)現(xiàn)。
5.定義類Ring,實(shí)現(xiàn)前一章項(xiàng)目3描述的接口。在實(shí)現(xiàn)中使用可變大小的數(shù)組。然后寫(xiě)一個(gè)程序,充分論證你的實(shí)現(xiàn)。
6.可以寫(xiě)一個(gè)集合或一個(gè)包,創(chuàng)建拼寫(xiě)檢查器。集合或包用作字典,且含有一組正確拼寫(xiě)的字。要看一個(gè)字是否拼寫(xiě)正確,可以看它是否含在字典中。使用這種方法對(duì)外部文件中保存的字創(chuàng)建拼寫(xiě)檢查器。為簡(jiǎn)化任務(wù),限制字典的規(guī)模。
7.重做前一個(gè)項(xiàng)目,創(chuàng)建拼寫(xiě)檢查器,但是將你要檢查拼寫(xiě)的字放入包中。字典(含有正確拼寫(xiě)字的集合或包)與要檢查的字的包之間的差,是拼寫(xiě)錯(cuò)誤的字的包。
自測(cè)題答案
1.學(xué)生仍然在連續(xù)編號(hào)的椅子上。不需要記錄空椅子的位置。
2.不移動(dòng)學(xué)生從而節(jié)省時(shí)間。
3.最大編號(hào)椅子中的學(xué)生。
4.不相等。僅當(dāng)包滿時(shí)兩個(gè)值才相等。
5.如果客戶含有如下的一條語(yǔ)句
則myBag.getCurrentSize()將是數(shù)組bagContents中項(xiàng)的個(gè)數(shù)。根據(jù)設(shè)計(jì),bagContents.length可以大于包中項(xiàng)的個(gè)數(shù)。
6.該語(yǔ)句將包的第一個(gè)元素設(shè)置為null。numberOfEntries的值不改變,所以它是5。
7.
8.包aBag為空。當(dāng)調(diào)用displayBag時(shí),執(zhí)行語(yǔ)句
當(dāng)調(diào)用toArray時(shí),執(zhí)行語(yǔ)句
因?yàn)閍Bag為空,所以numberOfEntries是0。因此新數(shù)組result是空的。跳過(guò)toArray中的循環(huán),返回空數(shù)組且賦給bagArray。因?yàn)閎agArray.length是0,所以跳過(guò)displayBag中的循環(huán)。調(diào)用displayBag(aBag)的結(jié)果是簡(jiǎn)單的一行:
9.優(yōu)點(diǎn):這個(gè)定義易寫(xiě),所以可能少犯錯(cuò)誤。
缺點(diǎn):這個(gè)定義要花更多的執(zhí)行時(shí)間,如果anEntry在包中出現(xiàn)多次時(shí)。注意,方法getFrequencyOf中的循環(huán)對(duì)包中的所有項(xiàng)重復(fù),而2.1.6節(jié)中所給的方法contains中的循環(huán)一旦找到所需的項(xiàng)立即結(jié)束。
10.
11.雖然對(duì)于客戶的方法和ArrayBag中的其他方法,包會(huì)變?yōu)榭盏?#xff0c;但被刪除對(duì)象的引用仍保留在數(shù)組bag中。即使客戶不保留指向這些對(duì)象的引用,與它們相關(guān)的內(nèi)存也沒(méi)被釋放。
12.設(shè)置bag[numberOfEntries]為null,該方法使得分配給被刪項(xiàng)的內(nèi)存被回收,除非客戶還有另一個(gè)指向這個(gè)項(xiàng)的引用。
13.數(shù)組bag中不是最后一項(xiàng)的項(xiàng)設(shè)置為null。其余的項(xiàng)不再位于數(shù)組的連續(xù)元素中。可以重新安排項(xiàng)來(lái)去掉null項(xiàng),或者修改其他方法跳過(guò)null項(xiàng)。
b.能。
15.在包中找到"B"后,remove方法將它替換為數(shù)組bag中的最后項(xiàng),即"C"。然后將最后項(xiàng)替換為null。雖然可以定義remove來(lái)得到問(wèn)題中所給出的兩個(gè)其他可能的結(jié)果,但每個(gè)結(jié)果都是不好的。例如,要得到"A","A","A","C",null,remove應(yīng)該移動(dòng)數(shù)組元素,需要更多的運(yùn)行時(shí)間。在數(shù)組中留下空隙,如"A","A",null,"A","C",對(duì)remove來(lái)說(shuō)容易辦到,但對(duì)其他方法邏輯就復(fù)雜了。
16.
17.
或者
18.
或者
19.
20.
21.簡(jiǎn)單的賦值語(yǔ)句可能不是好的選擇,因?yàn)榭蛻艨赡苁褂弥赶蜃鳛閰?shù)傳給構(gòu)造方法的數(shù)組的引用來(lái)破壞包的數(shù)據(jù)。復(fù)制參數(shù)數(shù)組到數(shù)組bag中是必需的,以保護(hù)包數(shù)據(jù)的完整性。
22.優(yōu)點(diǎn):如果你知道下標(biāo),可以直接訪問(wèn)任意數(shù)組位置。
缺點(diǎn):數(shù)組有固定的大小,所以或者浪費(fèi)空間或者超界。調(diào)整數(shù)組大小可以避免后一個(gè)缺點(diǎn),但需要將原始數(shù)組的內(nèi)容復(fù)制到更大的數(shù)組中。
總結(jié)
以上是生活随笔為你收集整理的《数据结构与抽象:Java语言描述(原书第4版)》一练习的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 20170626_oracle_数据库设
- 下一篇: Php实时输出