1 回答

TA貢獻1820條經驗 獲得超9個贊
博士
請考慮使用哈希映射而不是哈希集。具體來說,考慮
HashMap<KeyType, Object[]>,或者,甚至更好,
HashMap<KeyType, ItemWrapper>
其中,KeyType 是項類中的字符串、整數或某種其他類型的唯一標識符,而 ItemWrapper 是用于存儲相關數據的簡單類。
哈希映射可能比哈希集更適合于此
您說您不想使用數組,因為您希望使用標識符而不是添加順序的標識符進行快速檢索。您還希望將商品“映射”到數量計數。哈希映射將允許您將鍵與值相關聯,以便快速查找。
我們將從一個過于簡單的實現開始,然后讓它變得更好。我還將展示如何像您要求的那樣使用大小為 2 的數組,即使這不是最佳方法。
我們將改進的基本實現
在過于簡單的實現中,您的密鑰可能是您的 Item,您的值可能是數量。例如
HashMap<Item, Integer> myHashMap = new HashMap<Item, Integer>(1400);
public int addItem(Item item, int n) {
//...
int currentCount = myHashMap.getOrDefault(item, 0);
myHashMap.put(item, n + currentCount);
//...
}
public int quantityOf(Item item) {
return myHashMap.getOrDefault(item, 0);
}
public boolean isInLocker(Item item) {
return myHashMap.containsKey(item);
//or return this.quantityOf(item) > 0;
}
(請注意,此代碼依賴于自動裝箱和取消裝箱,但如果您愿意,可以在沒有它的情況下編寫。此外,您還可以調整哈希圖的初始容量。初始容量為 1400,負載系數為 .75,一旦 HashMap 中出現大約 1050 個項目,它將調整大小。
這樣做的麻煩在于,您需要已經擁有 Item 對象才能查找該項目,這在大多數情況下可能不切實際。(或者,至少,您需要具有相同結果的東西,并且返回為 true)。如果適用,可以在 Item 類中添加 和 。但是,如果為您提供了 Item 類,則不允許更改它(或不想更改),并且 和 不滿足快速查找的需求,該怎么辦?在這種情況下,您必須具有不同的鍵,例如 item ID 或唯一描述符(例如,如果程序中所有“鉛筆”項的處理方式相同,則字符串將起作用)。hashCode()equals()@OverrideshashCode()equals()hashCodes()equals()
更強大的方法
為了讓您的快速檢索夢想與HashMap一起工作,您需要一種獨特的方法來識別 Item 對象 - 我們將以此為關鍵。對于下面的示例代碼,我假設標識符是字符串。您還需要一種方法將物料與數量相關聯。
我建議不要使用 Object [],而是將 Item 包裝在一個新的簡單類中,該類同時跟蹤項目及其數量。例如:
class ItemWrapper {
Item item;
int quantity;
}
(我保持了示例的簡單性,但您可以根據需要將成員設為私有,添加獲取者/設置者等。
這樣,您的代碼就更具可讀性,并且需要的強制轉換更少。然后,你可以將它與代碼一起使用,如下所示:
HashMap<String, ItemWrapper> myHashMap = new HashMap<String, ItemWrapper>(1400);
public int addItem(Item item, int n) {
//...
ItemWrapper wrappedItem = myHashMap.get(item.uniqueID);
if (wrappedItem == null) {
wrappedItem = new ItemWrapper(item, n);
}
else {
wrappedItem.quantity += n;
}
myHashMap.put(item.uniqueID, wrappedItem);
//...
}
public int quantityOf(String itemID) {
ItemWrapper wrappedItem = myHashMap.get(itemID);
return wrappedItem == null ? 0 : wrappedItem.quantity;
}
public boolean isInLocker(String itemID) {
return myHashMap.containsKey(itemID);
//or return this.quantityOf(itemID) > 0;
}
使用數組直接回答您的問題(不是最佳方法)
在您的問題中,您詢問了大小為 2 的數組。上面的方法是我的建議,但是如果必須使用數組,則可以執行如下代碼所示的操作:
HashMap<Item, Object[]> myHashMap = new HashMap<Item, Object[]>(1400);
public int addItem(Item item, int n) {
//...
Object[] itemBundle = myHashMap.get(item.uniqueID);
if (itemBundle == null) {
itemBundle = new Object[2];
itemBundle[0] = item;
itemBundle[1] = new Integer(n);
}
else {
itemBundle[2] = new Integer((Integer)itemBundle[2] + n);
}
myHashMap.put(item.uniqueID, itemBundle);
//...
}
public int quantityOf(String itemID) {
return myHashMap.getOrDefault(itemID, 0);
}
public boolean isInLocker(String itemID) {
return myHashMap.containsKey(itemID);
//or return this.quantityOf(itemID) > 0;
}
道明
你關于測試驅動開發的“額外問題”可能最好作為一個單獨的問題來研究。您是否在詢問如何在概念上接近TDD,或者如何實際編寫用于測試的代碼?無論哪種方式,您都可以通過搜索堆棧溢出的現有內容找到很好的答案。
添加回答
舉報