2011-09-14 54 views
1

得到了解決方案..使用linkedHashMap並能夠將排序後的鍵值存儲在數組中。 Here是代碼的鏈接。將hashmap的鍵值存儲在字符串[]

可能重複:
store key values of sorted hashmap in string[]

我創建了一個散列映射,然後在使用this code地圖中的元件 '由值排序'。 代碼工作,我能夠在屏幕上顯示按值排序的鍵值對。

現在我想存儲鑰匙(從排序的元素)在String[]HashMap.keySet().toArray()沒有幫助,因爲已經退役的HashMap沒有排序。

任何人都可以請建議一種方法來做到這一點?

進一步說明情況 - 假設我通過使用上述鏈接獲得(a,1)(b,23)(c,7) 等關鍵值對,我可以得到(a,1)(c ,7)(b,23)作爲輸出。我想將{a,c,b}存儲爲一個字符串數組。 我希望問題現在清楚。

+0

上面的代碼片段返回一個鍵數組。我不明白這個問題。你想排序數組嗎? – home

+0

如果你的問題不清楚,不要問一個新問題。相反,請編輯原始問題以說清楚。 –

+0

這段代碼從散列表中返回一個鍵的數組,但我想要排序元素的鍵的數組。我希望我很清楚。 – Umang

回答

1

重用的代碼,你只想用

List keys = sortByValue(m); 
String[] keyArray = keys.toArray(new String[keys.size()]); 

使用泛型將使這更好。我也會根據Map.Entry(來自entrySet())進行排序,這會更快更簡單。

+0

'new String [0]'就足夠了,它效果很好:) –

+0

真,但它使用反射創建另一個副本。如果'new String [0]'不是空的,它將被丟棄。如果集合通常是空的,並且可以使'new String [0]'常量,這很好。否則它不那麼高效。 –

0

我會使用谷歌收集:

Map<String, String> map = new HashMap<String, String>(); 
    map.put("ABC1", "VALUE1"); 
    map.put("ABC7", "VALUE1"); 
    map.put("ABC2", "VALUE2"); 
    map.put("ABC3", "VALUE1"); 

    Multimap multimap = TreeMultimap.create(); 

    for(Map.Entry<String, String> entry: map.entrySet()) { 
     multimap.put(entry.getValue(), entry.getKey()); 
    } 


    System.out.println(Arrays.toString(multimap.values().toArray())); 
+0

我不想對鍵進行排序。我想獲得按照它們相應的值排序的鍵數組。 – Umang

+0

值是唯一的還是可以有dublicates? – Alexandr

+0

可能有重複的值。 – Umang

0

排序我的鑰匙是簡單,使用TreeMap

TreepMap sortedMap = new TreeMap(someHashMap); 
String[] sortedKeys = sortedMap.keySet().toArray(); 
0

該代碼是不是真的排序HashMap的 - 它僅僅是返回鍵,通過它們的值進行排序:

因此,所有你需要的是:

Object[] key_array = sortByValue(m).toArray(); 
0

我會去要麼類似的東西

private static String[] keysSortedByValue(final Map<String, String> m) { 
    final String[] result = m.keySet().toArray(new String[m.size()]); 
    Arrays.sort(result, new Comparator<String>() { 
     @Override 
     public int compare(String o1, String o2) { 
      final String v1 = m.get(o1); 
      final String v2 = m.get(o2); 
      if (v1==v2) return 0; 
      if (v1==null) return -1; 
      if (v2==null) return +1; 
      return v1.compareTo(v2); 
     } 
    }); 
    return result; 
} 

,或者使用Map.Entry[]更高的效率(避免了查找)。

相關問題