2012-02-13 74 views
1

作爲正在進行的類項目的一部分,我們被要求實現地圖以獲得更好的對象鏈接。Java HashMap搜索

總之,我們目前已持有對象的四個的ArrayList

// Array Lists used for sorting. 
private static ArrayList<Party> partyList = new ArrayList<Party>(); 
private static ArrayList<Creature> creatureList = new ArrayList<Creature>(); 
private static ArrayList<Treasure> treasureList = new ArrayList<Treasure>(); 
private static ArrayList<Artifact> artifactList = new ArrayList<Artifact>(); 

每個職業都有自己的領域(即,方有「指標」,「姓名」,生物具有「指標」,「名」 ,「年齡」,高度」,等等...但他們都有一個唯一索引)這個星期我們要實現包含HashMap,其中一個對象的關鍵,是它的索引

所以,作爲例子:

creatureMap.put(creature.index, creature) 
... 

我們的程序還允許搜索。所以我明白,現在當我們通過索引進行搜索時,我們只是搜索適合我們需要的索引的散列表,並使用它的值作爲對象。

但是,我們的程序還允許用戶通過名稱,身高,體重等進行搜索。那麼,如果hashmaps只有在通過索引進行搜索時纔有用,那麼如何有效地使用hashmaps呢?如果我想按名稱搜索一個生物會發生什麼?我將不得不循環hashmap中的每個值,看看它的'名稱'字段......這正是我正在處理的數組列表。

我們的教授說這話的時候有人問過類似的問題:

的想法是,在第一個項目,簡單的辦法是 插入所有項目到數組列表,當一個需要鏈接 生物到派對或物品到生物時,必須線性搜索ArrayList,直到找到物品的索引。 這是O(n)操作,如果ArrayList未排序,並且O(log n)操作(如果列表已排序,但排序通常爲O(n * n) 或O(n log n))在使用的分揀操作上。

本週,我要求您在地圖數據結構上實施基於 的O(1)搜索系統。因此,我們應該使用一個項目的索引作爲 它的關鍵來生成鏈接。這在處理 輸入文件時使用一次。

因此,我不確定我是否正確理解地圖/鍵值對的概念。

回答

3

你的理解是正確的:如果你的密鑰是一個索引,你只能使用該索引來高效地查找索引。如果你想按名稱搜索,那麼你必須鍵入名稱。

我不是這個意思是什麼你的教授太相信:

因此,我們應該用一個項目的索引作爲其鍵生成的鏈接。

(我想他指的是通過索引鏈接對象,如「鏈接生物的一方」 - 也許他沒有提及使用包含HashMap的搜索)

在一個側面說明,根據接口而不是具體類型聲明變量是一種很好的做法。在你的榜樣,你應該定義你的清單領域List而不是ArrayList

private static List<Party> partyList = new ArrayList<Party>(); 
1

通過您的問題(和報表),以便運行....

讓我明白,現在,當我們按索引搜索,我們只需搜索 適合我們需要的索引的散列表,並使用其值爲 的對象。

這是正確的。

然而,我們的程序還允許用戶通過姓名,身高,體重,搜索等,所以,如何被使用效率些,如果只通過索引搜索時幫助包含HashMap?

如果你的hashmap只是通過索引存儲,那麼你是正確的,它不能幫助你通過任何其他字段進行搜索。您可以創建一個映射這些字段還可以,但我不認爲這是你的教授希望(見下文)

,如果我想按名稱搜索的生物,會發生什麼呢?我將不得不循環hashmap中的每個值,看看它的'名稱'字段......這正是我正在處理的數組列表。

是的,如果您需要按名稱搜索,那麼您將使用values()方法並遍歷該方法,檢查每個項目。

當一個人需要一個生物鏈接到當事人,或對生物的項目,一個人必須要線性搜索的ArrayList,直到該項目的索引被發現
...
因此,我們應該使用項目的索引作爲其關鍵字來生成鏈接。這在輸入文件的處理過程中使用一次。

這暗示了我的另一部分任務 - 與讀取來自文件的輸入以及將各方,生物和物品連接在一起。

我假設參與派對的輸入文件通過index來引用生物(同樣對於生物來說也是指物品)。
教授要你用這些hashmaps加速的聯動。
我不認爲他是試圖讓你的方式來改變其他類型的搜索作品

(顯然,這是一種猜測,因爲我不知道該怎麼分配實際上說的)

+0

的確。輸入文件包含我們創建對象的行。例如(p:001:週末戰士),該行告訴我們要創建一個聚會對象,它的索引是001,它的名字是週末戰士。同樣的,一個生物會是這樣的,但它也會有另一個索引,它就是它所屬的派對。(c:250:conan:001) – sqram 2012-02-13 02:28:47

+2

對。因此,對於List版本的代碼,您必須遍歷列表才能找到聚會#001,這會讓您的文件讀取代碼相對較慢(當您有很多參與者循環時)。地圖版本將通過執行索引[O(1)]查找而不是迭代[O(n)]查找來加速文件讀取代碼。 – Tim 2012-02-13 02:34:20

+0

謝謝。希望我能接受兩個答案= | – sqram 2012-02-13 02:37:00