2013-02-20 69 views
2

當我嘗試將數組和ArrayList作爲鍵放入Map中時遇到此問題。 第一段代碼:ArrayList <X>作爲HashMap中的鍵,但X []數組不起作用

 LinkedHashMap<ArrayList<String>, String> lhm = new LinkedHashMap<ArrayList<String>, String>(); 
    for (int i =0;i < strs.length; i++){ 
     ArrayList<String> arr = new 
      ArrayList<String>(Arrays.asList(strs[i].toLowerCase().split(" "))); 
     Collections.sort(arr); 
     lhm.put(arr, strs[i]); 
    } 

第二條代碼:

LinkedHashMap<String[], String> lhm = new LinkedHashMap<String[], String>(); 
for (int i =0;i < strs.length; i++){ 
    String[] str = strs[i].toLowerCase().split(" "); 
     Arrays.sort(str); 
     System.out.println("***********"); 
     for (String strin :str) 
     { 
      System.out.println(strin); 
     } 
     System.out.println("***********"); 
     lhm.put(str, strs[i]); 
    } 

的第一段代碼按預期工作,每當我把一個重複鍵(ArrayList中的相同內容的密鑰),它覆蓋前一個鍵的值。 但第二部分不符合預期。它只是把所有的價值。 有人可以解釋這是如何工作的? 這是一個很好的做法,把Array/ArrayList(或可能收藏作爲關鍵)?

+2

使用可變對象作爲地圖的關鍵是罕見的好想法... – assylias 2013-02-20 23:35:06

+0

我不知道你想賺什麼,你能更具體嗎?如果你想要不同值的同一個鍵,你可以使用Guava庫的Multimap。 – Martin 2013-02-20 23:36:47

+0

@pst:是的,這是事實,我相信。但是我只想「懶惰」一次,所以不是使用「array.toString」作爲鍵,而是將數組本身放入。 – Accessdenier 2013-02-20 23:38:51

回答

5

Java中的數組使用從Object繼承的默認equals方法。同上hashCode方法。所以即使你把數組和鍵放在相同的元素上,你也會得到'重複'。另一方面,列表覆蓋散列碼方法,以返回更多代表其內容的值。

在任何情況下,使用可變對象作爲散列表中的鍵通常是一個壞主意,儘管在某些情況下它是不可避免的。特別是使用集合作爲關鍵字可以以多種方式讓你感到興奮;

  • 將元素添加到列表中
  • 列表中的變異對象,在某種程度上在它們的hashCode /平等合同變更
+0

@pst - 同意。在這種情況下,動詞是問題,而不是名詞。我淡化了一些「修辭」。 – Perception 2013-02-20 23:45:54

+0

@Perception ok,數組不會覆蓋hashcode()和equals()函數。所以,地圖認爲他們是不同的鑰匙。知道了謝謝 – Accessdenier 2013-02-20 23:46:37