天天看點

《資料結構與抽象:Java語言描述(原書第4版)》一1.3 使用ADT包

本節書摘來華章計算機《資料結構與抽象:java語言描述(原書第4版)》一書中的第1章 ,第1.3節,[美]弗蘭克m.卡拉諾(frank m. carrano) 蒂莫西m.亨利(timothy m. henry) 著 羅得島大學  新英格蘭理工學院 辛運帏 饒一梅 譯 更多章節内容可以通路雲栖社群“華章計算機”公衆号檢視。

假定我們雇用一名程式員使用java實作adt包,給定到目前為止已有的接口和規格說明。如果假定這些規格說明已經足夠清楚能讓程式員完成相關的實作,那麼我們可以在程式中使用這些adt操作而不需要知道實作的細節。即,我們不需要知道程式員如何實作這個包,也能使用這個包。我們隻需知道adt包做什麼就可以了。本節假定已經有了一個java類bag,它實作了程式清單1-1給出的java接口baginterface。簡單的例子說明我們如何使用bag。

在程式清單1-2的第13行,注意一旦我們選擇了包中對象的資料類型(本例中是item),這個資料類型就包含在接口名後面的尖括号中。還要注意類名後面的空尖括号。包中的所有項必須是這個資料類型或這個資料類型的子類型。編譯程式強制我們遵守這條約定。如果是基本資料類型,則可以将對應的包裝類的執行個體放入包中。例如,不是使用基本資料類型int的執行個體,而是使用包裝類integer的執行個體。

示例:線上購物。當線上購物時,你挑選的商品儲存在購物車或購物袋内,直到你準備去結賬為止。實作購物網站的程式可以使用類bag來維護購物車。畢竟,你挑選的購買物品的次序是不重要的。程式清單1-2顯示這樣一個程式的簡單示例。

程式清單1-2 線上購物中購物袋的維護程式

《資料結構與抽象:Java語言描述(原書第4版)》一1.3 使用ADT包
《資料結構與抽象:Java語言描述(原書第4版)》一1.3 使用ADT包

為使示例簡單,我們建立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 撲滿的類

《資料結構與抽象:Java語言描述(原書第4版)》一1.3 使用ADT包
《資料結構與抽象:Java語言描述(原書第4版)》一1.3 使用ADT包

程式清單1-4提供了類piggybank的主要示例。程式将一些硬币添加到撲滿中,然後再删除所有的硬币。因為程式沒有記錄添加到撲滿中的硬币,是以沒辦法控制删除哪個硬币。雖然輸出的内容表示從撲滿中拿走硬币的次序與它們放入撲滿中的次序相反,但這個次序依賴于包的實作。我們在下一章将考慮這些實作。

注意,除了main方法外,程式定義了另一個方法addcoin。因為main是靜态的且調用addcoin,是以addcoin也必須是靜态的。方法addcoin接收的參數是一個coin對象和一個piggybank對象。然後該方法将硬币添加到撲滿中。

程式清單1-4 類piggybank的示例

《資料結構與抽象:Java語言描述(原書第4版)》一1.3 使用ADT包
《資料結構與抽象:Java語言描述(原書第4版)》一1.3 使用ADT包
注:方法可以改變作為參數傳給它的對象的狀态

将兩個參數傳給方法addcoin:一個硬币和一個撲滿。這兩個參數都是main方法中已存在的對象的引用。方法addcoin儲存參數中這些引用的副本,你應該記得,它們的行為像局部變量。雖然addcoin不能改變引用,但因為它們已存在于main方法中,是以它能改變所指對象的狀态。具體來說,它能通過向撲滿中添加硬币來修改撲滿(即piggybank對象)。記住,這個撲滿隻局部于main,且在addcoin的外面。

注:一旦在下一章實作了包類,你就能實際運作前一個程式清單中給出的程式。你隻需要将類名bag替換為下一章中的示例使用的一個類名即可。 自測題8 考慮程式清單1-4中的程式。在建立類piggybank的執行個體mybank後,假定将幾個未知硬币添加到mybank中。寫代碼,從撲滿中删除硬币,直到或者删除一分錢硬币,或者撲滿為空時為止。