亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

當項目存儲在Arr[0]中時,我如何確定項目是否存在于大小為2的數組的哈希集中?

當項目存儲在Arr[0]中時,我如何確定項目是否存在于大小為2的數組的哈希集中?

陪伴而非守候 2022-09-28 15:28:29
我正在嘗試為大學的家庭作業創建一個儲物柜類和一個長期存儲類。他們都應該能夠存儲一個由我們的老師制作的具有體積和類型的 Item 對象。(而每個儲物柜的存儲單元數量有限,長期存儲的固定數量為1000個單元。我正在嘗試決定如何以最佳方式實現存儲。我想過創建一個Arrae,因為我知道一般來說,1000個項目的頂部并不多,但我想寫出我能寫出最好和最有效的代碼,并且對它們的順序并不重要。我們剛剛了解了哈希集,所以我考慮過創建一個哈希集,這使我的程序的運行時變得更好。問題是我需要計算每種類型存儲的項目數量,并且集不允許重復。因此,我想也許可以創建一個長度為2的數組哈希集,以跟蹤一種類型的項目及其在存儲中的數量。我真的不確定實現這種存儲的最佳方法是什么,也許我選擇了絕對錯誤的方式。在我看來,當我想從1000中找到一種特定類型的項目時,簡單的數組不是很有效。(如果長期存儲中存儲了1000個不同類型和體積為1的不同項目)。一個額外的問題:在這個練習中,我應該使用TDD方法(測試驅動開發),我不確定如何正確實現測試代碼。幫助將不勝感激。(應該與 J 單元和斷言一起使用)。我的代碼開頭的示例:import oop.ex3.spaceship.*;import java.lang.reflect.Array;import java.util.*;public class Locker {    private static final int TOO_MANY_ITEMS = -1;    private static final int WORKED_WELL = 0;    private static final int MOVED_TO_LONG_TERM = 1;    private final int capacity;    private int currentLoad;    private HashSet<Item> itemsStored;    public Locker(int capacity){        this.capacity = capacity;        this.currentLoad = 0;        itemsStored = new HashSet<>();    }    public int addItem(Item item, int n){        if (currentLoad + n*item.getVolume() < capacity){        }        else{            return this.TOO_MANY_ITEMS;        }        return 0;    }
查看完整描述

1 回答

?
慕妹3146593

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,或者如何實際編寫用于測試的代碼?無論哪種方式,您都可以通過搜索堆棧溢出的現有內容找到很好的答案。


查看完整回答
反對 回復 2022-09-28
  • 1 回答
  • 0 關注
  • 98 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號