本節書摘來華章計算機《資料結構與抽象:java語言描述(原書第4版)》一書中的第2章 ,第2.1.6節,[美]弗蘭克m.卡拉諾(frank m. carrano) 蒂莫西m.亨利(timothy m. henry) 著 羅得島大學 新英格蘭理工學院 辛運帏 饒一梅 譯 更多章節内容可以通路雲栖社群“華章計算機”公衆号檢視。
既然可以向包中添加對象,那麼就可以實作其餘的方法,從最簡單的開始。直到我們明白如何查找一個包時再來定義remove方法。
方法isempty和getcurrentsize。方法isempty和getcurrentsize的定義很簡單,正如你所見的:

安全說明:方法應該何時調用checkinitialization?
方法isempty和getcurrentsize沒有調用checkinitialization。雖然它們能調用,但我們不想因不必要的安全檢查而使客戶的性能降低。兩個方法都涉及資料域numberofentries。即使構造方法沒有完成它的初始化,也沒有将這個域設定為0,但java使用預設值将它初始化為0。是以,任何已進行部分初始化的包都是空的。對于arraybag,通路數組bag的方法都應該確定它已存在。
注:有些方法的定義非常簡單,幾乎與類的早期版本中用來定義它們的存根是一樣的。方法isempty和getcurrentsize就是這樣一種情況。雖然這兩個方法不在第一組核心方法中,但它們本來可以在,即我們可以更早地定義它們,而不是為它們寫存根。
方法getfrequencyof。為計數給定對象在包中出現的次數,我們計數對象在數組bag中出現的次數。使用for循環,下标從0到numberofentries-1,将給定對象與數組中的每個對象進行比較。當發現相等時,計數器加1。循環結束時,隻要傳回計數器的值就可以了。注意,比較對象時必須使用方法equals,而不是使用相等操作符==,即必須寫語句
而不是寫語句
假定在對象所屬的類中定義了自己的equals方法。
這個方法定義如下。
方法contains。要檢視包中是否含有給定的對象,可以再次查找數組bag。這裡需要的循環類似于方法getfrequencyof中使用的,但是一旦發現要尋找項的第一次出現,循環就應該立刻停止。描述這個邏輯的僞代碼如下:
在兩個條件下,這個循環會終止:已經在數組中找到anentry或者已經查找了整個數組但沒成功。
然後定義方法contains。
注:兩種循環
為計數數組中項出現的次數,方法getfrequencyof使用一個循環來通路數組的所有項。事實上,循環體執行了numberofentries次。相反,為表示一個給定項是否出現在一個數組中,方法contains中的循環一旦找到要尋找的項就立即結束。這個循環的循環體執行的次數為1~numberofentries。你應該能輕松地寫出執行固定次數或可變次數的循環。
自測題9 方法contains可以調用getfrequencyof而不是執行一個循環,即你可以像下面這樣定義方法:
這個定義與前一段中給出的定義相比,優缺點各是什麼?
測試其他的方法。在為類arraybag定義其他方法的同時,應該測試它們。本書的線上網站提供的程式arraybagdemo2僅關注這些額外的方法。不過,你應該逐漸形成一個測試程式,以便它能測試到目前為止你已經定義的所有方法。類arraybag到目前為止的版本,可在線上網站上名為arraybag2的源代碼中找到。