2010-11-29 60 views
0

我有一個Map<String,String>,它有像「User1」,「43」這樣的條目。現在我想要一個最高值的「前三名」。從地圖<字符串,字符串>獲取3個最高值

使用Map<String,Integer>會更容易一些,但是由於技術上的限制,我可以將該地圖作爲<String,String>來抓取。

<String,String>地圖轉換爲<String,Int>地圖然後對其進行排序的最有效方法是什麼?

回答

0

您可以遍歷Map的值(使用Map.values()),將每個值轉換爲Integer(使用Integer.getInteger(String s)),並跟蹤您看到的前3個。

或者,您可以像上面那樣做,但不是跟蹤前3個,做一個LinkedList並在正確的位置插入每個Integer(遍歷LinkedList,直到找到Integer應該插入的位置)。

1

有幾種方法:

  1. 創建SortedMap的,例如帶有自定義-anonymous-比較器的TreeMap,它通過查找它在compare()方法調用中獲得的鍵,與原始地圖中的值進行比較來執行比較。
  2. 通過addAll()方法使用原始中的所有鍵/值條目填充它。
  3. 觀看地圖按價值排序。
  4. 搶頭/尾(取決於你比較排序如何)

與上述相類似:

  1. 創建如上一個自定義比較鍵的一個TreeSet ...
  2. 填充它與您的原始地圖的keySet()。
  3. 抓住鑰匙的頭部/尾部組。
  4. 創建從原始地圖這些密鑰和值的新地圖...
3

<String, String>轉換爲<String, Integer>你可以使用:

Map<String, Integer> treemap = new HashMap<String, Integer>(); 
for (Entry<String, String> entry : entries) { 
    treemap.put(entry.getKey(), Integer.parseInt(entry.getValue())); 
} 

但是,那麼你將不得不遍歷地圖再次。如果你不需要整個地圖,而只需要前3名,那麼你可以簡單地迭代條目,並通過比較獲得前三名。

或者,如果您同時需要頂部元素和全部數據,則可以反轉鍵和值並將TreeMap<Integer, String>Comparator一起使用。

1

你可以只把值的列表,並對其進行排序,如果這張圖是非常大的可能會更好來遍歷它,並只選擇3種最高值,而無需進行排序整個名單

ArrayList<Integer> highest = new ArrayList<Integer>(); 
for (String value : map.values()) { 
    highest.add(Integer.parseInt(value)); 
} 
Collections.sort(highest); 
for(int i = highest.size() - 1; i >=0 && i > highest.size()-4; i--){ 
    System.out.println(highest.get(i)); 
} 

相關問題