2011-06-16 36 views
2

我需要存儲一個動態創建的對象列表,以便可以全部檢索它們的方法並根據需要調用它們的方法。Java:使用散列表,檢索所有值和調用方法

就我可以看到的列表和創建,一個HashMap適合我的需求,但我有點困惑回憶對象和使用HashMap調用他們的方法。

只是作爲參考,讓我給你一個小代碼:

這裏是HashMap的:

Map<String, Object> unitMap = new HashMap<String, Object>(); 

// here is how I put an object in the Map notice i'm passing coordinates to the constructor: 
unitMap.put("1", new Worker(240, 240)); 
unitMap.put("2", new Worker(240, 240)); 

現在我需要創建在HashMap中檢索每個對象的方法和調用方法從每個對象。這是可能的還是可以創建的對象只能被直接引用。如果是這樣,是否有另一種方式來動態調用一個類的所有現有實例的方法(換句話說,在用戶輸入)?

+0

HashMaps具有唯一鍵,所以您只能爲每個鍵值插入一個對象(在您的情況下爲「1」)。要訪問所有成員,只需在下面的答案中遍歷容器即可。 – 2011-06-16 01:50:41

+0

@Kerrek對不起,我打算讓每個項目成爲不同的關鍵。 – cody 2011-06-16 02:17:57

+0

不要忘記「接受」你認爲有用的答案,所以我們歡迎你回答你的下一個問題! :-) – 2011-06-16 02:32:21

回答

8

當然。你可以這樣做:

for (Object thing : unitMap.values()) { 
    // use "thing" here 
} 

如果您需要的按鍵也一樣,你可以得到公正的鑰匙:

for (String key : unitMap.keySet()) { 
    // use "key" here 
} 

或兩個鍵和值一起:

for (Map.Entry<String, Object> entry : unitMap.entrySet()) { 
    // use "entry.getKey()" and "entry.getValue()" 
} 

在所有上述情況下,地圖中的每個條目都被逐一遍歷。因此,在循環結束時,您將處理地圖中的所有條目。

+0

雖然我有點困惑。在上面的代碼中可以說我想使用每個對象調用getCord()的方法來檢索對象的座標(哪些是不同種類的對象)。我如何使用上述方法做到這一點?我會使用「thing」作爲一個變量的類型,並把'thing.getCord()'放在循環體中嗎?對不起,我很初學,所以我需要特異性。 lol – cody 2011-06-16 02:13:06

+0

在第三個例子中,'entry.getValue()'是'Worker'類型的對象;在第一個例子中,'thing'同樣也是Worker類型的一個對象。如果有'Worker :: getCoord()'成員函數,那麼的確可以說'think.getCoord()'或'entry.getValue()。getCoord()'。 – 2011-06-16 02:23:00

+0

@Kerrek SB在我的代碼中使用第一個示例時,事物只被識別爲對象,而不是作爲類型worker,因此當我使用thing.getCoord();它不被認爲是一個成員函數。我想最壞的情況下,我可以爲每個對象類型創建一個hashmap,但是你有沒有想過爲什麼它不適用於每種對象類型? – cody 2011-06-16 02:47:02

1

如果映射中的所有值都是Worker對象,則應聲明映射的類型爲Map<String, Worker>。這樣,當你從地圖中拉出一個值時,它將被輸入爲Worker。這樣,您可以調用Worker上聲明的任何方法,而不必在運行時使用instanceof檢查類型。

如果地圖保存不同的值,並且需要將值類型保留爲Object,則可能有利的是使用接口來定義要爲每個不同的對象類型調用的方法。

如果您不知道在運行時需要在值上運行哪種方法,並且地圖可以保存不同的值,則只需執行您目前正在執行的操作,然後使用Map<String, Object>

最後,爲了得到地圖的價值,你就像Chris Jester-Young在我之前提到的一樣。正如我之前所說的,最大的優點是您的對象將被鍵入,並且您將不需要進行投射/實例檢查。

0

我用這個將所有來自hashMap的值放在List上,希望它有幫助。

private List<String> getValuesFromHashMap(HashMap<String, String> hashMap) { 

    List<String> values = new ArrayList<String>(); 

    for (String item : hashMap.values()) { 
     values.add(item); 
    } 

    return values; 
}