2012-03-08 41 views
2

我正在和朋友一起玩視頻遊戲。爲了說明不同類型的項目,我們最初爲擴展Item類的每個項目都有一個類。這些課程中沒有太多數據,所以我一直在尋找替代方案,以便我們的工作空間不那麼混亂。我開始學習HashMaps,並且我認爲它們是增加項目的好方法。我們也可以設置它,以便不用int來訪問HashMap中的項目,這基本上只會使它成爲一個ArrayList,我們可以使用Strings來訪問它們。因此,我開始添加此功能,在Item類中創建匿名項目:如何使用HashMap作爲訪問和複製列表項目的方式?

private static Item coal = new Item() { 
     weight = .2; 
     setImageID(0, 16); 
    } 

並將它們添加到HashMap中。

itemMap.put("Coal", coal); 

做了幾個這些後,我意識到,有列表中的每個類型的唯一一個項目,如果我們想有這些項目的倍數,可以在不修改原有的修改,我們需要複印。我開始研究如何做到這一點。我們可以使用拷貝構造函數,但是項目中有太多變量需要高效完成。我們當然可以做到這一點,但我想知道是否有一個簡單的解決方案。我們可以讓所有物品最終?我只是喋喋不休,因爲我對這個編程領域完全陌生。我們也可能把這件事做錯了。我只需要一種方法來使用HashMap來創建「項目數據庫」的某些內容,我可以使用它來訪問列表中的無限數量的項目。有什麼建議麼?

回答

5

如何讓HashMap具有一組值(或者列表取決於相同的項目是否可以存在多次)?

Map<String, Set<Item>> map = new HashMap<String, Set<Item>>(); 

這樣,每種類型都可以有多個項目。添加到該類型的一組新的項目

一個成語是下面:

Set<Item> items = map.get(type); 
if (items == null) { 
    items = new HashSet<Item>(); 
    items.put(type, items); 
} 
items.add(item); 

它甚至可能不是一個壞主意,使用Enum你的類型,而不是隻是一個字符串。那麼你可以做一些像map.put(Item.COAL, itemSet);這將有助於防止錯別字和大小寫敏感性問題。

0

會也許工作?那麼代替itemMap.put("Coal", coal),您必須確保itemMap.get(「Coal」)已經有一個數組列表,並將新項目追加到列表中。

0

你知道嗎,你可以用這樣的語句指定地圖:

HashMap<Integer, Item[]> map = new HashMap<Integer, Item[]>(); 

HashMap<String, Item[]> map = new HashMap<String, Item[]>(); 

相關聯項目中的每一組/陣列/列表與整數或字符串可以爲你的工作問題。

0

如果我正確理解這一點,你應該有一個列表中的每個HashMap中的所有項目來訪問項目類型下的多個項目。要做到這一點只是做一個HashMap<String, ArrayList<Item>>。當您第一次創建項目類型時,創建一個新的ArrayList<Item>並添加相同項目類型的後續項目,只需追加到列表。

但是,HashMap不是那麼高效。如果你有一個已知數量的項目類型,我會使它成爲ArrayList<ArrayList<Item>>,這樣你可以用一個initialCapacity初始化外部ArrayList,它等於你擁有的項目類型的數量,並且有一個方法可以將項目類型的名稱轉換爲索引它存儲在外部ArrayList中,由於缺少負載因子並繞過散列函數的開銷,因此存儲效率更高。將項目名稱轉換爲索引的方法的另一種方法是向每個項目類型添加項目類型ID。

所以你會:

class Coal { 
    public int id = 0 
} 

假設你的外部的ArrayList名爲itemTypes和你的產品coal,將只會是:

itemTypes.get(coal.id).add(coal) 

上實現你想使用你的電話,寫入的HashMap更簡單,編寫的代碼更少,而且性能更低,內存使用更多。