2017-09-26 45 views
0

我有一個List<Map<String, String>>。地圖的一個特定值是帶小數的數字條目。我希望根據地圖的特定值以降序對列表進行排序。基於特定數值對地圖<字符串,字符串>列表排序

例如:

List<Map<String, String>> foo= new ArrayList<Map<String, String>>(); 
Map<String, String> bar1 = new HashMap<>(); 
Map<String, String> bar2 = new HashMap<>(); 
Map<String, String> bar3 = new HashMap<>(); 

bar1.put("name", "abc"); 
bar1.put("score", "72.5"); 
bar1.put("sex", "male"); 
foo.add(bar1); 

bar2.put("name", "pqr"); 
bar2.put("score", "98.7"); 
bar2.put("sex", "female"); 
foo.add(bar2); 

bar3.put("name", "xyz"); 
bar3.put("score", "100.0"); 
bar3.put("sex", "male"); 
foo.add(bar3); 
. 
. 
. 
. 

我想將List<Map<String, String>>降序使得含有的100.0得分地圖位於頂部排序。

我試圖

Collections.sort(list, new Comparator<Map.Entry<K, V>>() { 
    @Override 
    public int compare(Map.Entry<K, V> o1, Map.Entry<K, V> o2) { 
     return (o1.getValue()).compareTo(o2.getValue()); 
    } 
}); 

但「V」這裏是一個字符串,而我需要它來進行排序爲float。 任何幫助,將不勝感激。

+0

的[顯示結果值(Java)的一個Map (https://stackoverflow.com/questions/109383/sort-a-mapkey-value-by-values-java) – Flown

+0

是如何可能的複製這應該工作,如果價值無法解析爲浮動? –

+0

@Flown我可能是錯的,但我已經嘗試過這個解決方案。我的問題是與字符串的類型轉換爲浮動或清除,根據該浮點值對具有一個特定浮動值的映射<字符串,字符串>進行排序。 – cppnoob

回答

2

如果無法建立從地圖一類的,那麼你可以這樣做:

Collections.sort(foo, (o1, o2) -> { 
     return new BigDecimal(o2.get("score")).compareTo(new BigDecimal(o1.get("score"))); 
    }); 

,或者如果你沒有使用Java 8:

Collections.sort(foo, new Comparator<Map<String, String>>() { 
      @Override 
      public int compare(Map<String, String> o1, Map<String, String> o2) { 
       return new BigDecimal(o2.get("score")).compareTo(new BigDecimal(o1.get("score"))); 
      } 
     }); 
+0

他可能不使用JAVA8 –

+0

我無法創建單獨的課程,因爲我正在使用YAML文件使密鑰動態化。但否則,您的解決方案工作。謝謝 – cppnoob

0

爲什麼你需要List Of map,你可以去用List<SomeClass>,並根據需要,一些類將持有你的值來排序爲name sex score.

編輯:您可以使用轉換你的字符串在浮動或可採取浮動作爲Someclass數據類型,它使您的代碼變得非常簡單。

+0

我發佈了一個非常簡化的舊版代碼。我使用yml使密鑰動態化。請放心,我已考慮開設一個單獨的課程,但對我而言,目前尚不可能 – cppnoob

0

這可能是一個又一個解決方案簡單

使用浮動解析字符串,並利用現有的比較浮動的方法。

Collections.sort(foo, new Comparator<Map<String, String>>() { 
      @Override 
      public int compare(Map<String, String> o1, Map<String, String> o2) { 
       return Float.compare(Float.parseFloat(o2.get("score")), Float.parseFloat(o1.get("score"))); 
      } 
     }); 
相關問題