2014-10-30 81 views
1

是否有可能需要一個HashMap並能夠提供任何帶有Strings鍵的HashMap?某種類型的通用數據要放置而不是「值」?方法中的Java HashMap

public void example(HashMap<String, Value> hashMap) { 
    //Stuff 
} 

example(new HashMap<String, Integer>); 
HashMap<String, String> exampleMap = new HashMap<>(); 
example(exampleMap); 

可替代地,是可以檢查的地圖的鍵/值類型,不是通過所有的鍵/值循環其他和instanceof檢查(不與返回停止它)?

public Boolean example(HashMap<String, Value> hashMap) { 
    for (Value value : hashMap.values())) { 
     if (value instanceof String) { 
      return true; //<- Unwanted 
     } 
    } 
} 

編輯: 讓我再解釋一下我的問題。我有一個方法:

public static Object getEIC(HashMap<String, Object> map, String key) { 
    for (String keys : map.keySet()) { 
     if (keys.equalsIgnoreCase(key)) { 
      return map.get(keys); 
     } 
    } 
    return null; 
} 

EIC代表equalsIgnoreCase。所以我需要一些通用的返回類型。感謝迄今爲止的答案,並感謝正面的答案!

+3

Java中的「通用」數據類型是「Object」。 – azurefrog 2014-10-30 21:14:59

+1

那麼,你可以有'public void example(HashMap hashMap)';但我沒有看到你需要一個'HashMap'而不是一個普通的'Map' – fge 2014-10-30 21:15:20

+0

你只是試圖實現一個Map 你想要區分大小寫的鍵嗎?如果是這樣看看http://stackoverflow.com/questions/8236945/case-insensitive-string-as-hashmap-key – 2014-10-30 21:31:51

回答

3

你可以這樣做:

HashMap<String, Object> 

但是,因爲你最終的instanceof做所有的時間太可怕了,雖然。你真正需要做的是理解關鍵問題是什麼,然後考慮繼承。你能定義一個你的所有值對象都能實現的接口嗎?例如可由Rectangle和Circle實現的GeometricShape。

此外,還可以如下定義一個HashMap:

HashMap<String, ? extends SomeClass> 

正如有人指出,這是最好的使用界面地圖,而不是一個具體的實施例如HashMap中。

最後,正如我在評論中指出的那樣,您似乎只是試圖實現一個想要區分大小寫的鍵的Map<key, value>。如果這樣看看www.stackoverflow.com/questions/8236945/

0

是的,但要求Map<String, Value>更好。如果你不在意要求什麼價值Map<String, ?>。如果你這樣做,但還不知道它會是什麼,請使用Map<String, ? extends T>

要求HashMap編程爲實現而不是接口。這樣做很少有很好的理由。

而且沒有。如果你不相信建立地圖的人,並且想要確定地圖只包含它應該包含的類型,你必須循環和檢查每一個。但是,您可以通過一種方法將其抽象出來,這樣您就不必再去查看它了。

public class CheckedCast 
{ 

    public static <K,V> Map<K,V> mapOf(Class<? extends K> classK, 
             Class<? extends V> classV, 
             Map<?,?> m) 
    { 
     for (Map.Entry<?, ?> e: m.entrySet()) 
     { 
      classK.cast(e.getKey()); 
      classV.cast(e.getValue()); 
     } 

     @SuppressWarnings("unchecked") 
     Map<K,V> result = (Map<K,V>) m; 
     return result; 

    } 
} 
0

答案是使用CaseInsensitiveMap。謝謝大家,幫助我,特別是David Brossard提出這個建議。

+0

不客氣! – 2014-10-30 21:44:46

0

你可以實現你正在尋找使用泛型靜態方法:

public static <V> V getEIC(Map<String, V> map, String key) { 
    for (String k : map.keySet()) { 
     if (k.equalsIgnoreCase(key)) { 
      return map.get(key); 
     } 
    } 
    return null; 
} 

不過,你不妨考慮增強MapIs there a good way to have a Map<String, ?> get and put ignoring case?

但是請注意,這之間存在着細微的差別此解決方案和使用無情況等於 - 一個普通的Map<String,V>可能會保留「密鑰」「密鑰」的值,而無情況Map不會。此方法將隨意選擇其中的一個,而無案例Map將選擇最近的添加。