2017-09-26 7 views
0

私にはList<Map<String, String>>があります。マップの1つの特定の値は、小数点を含む数値入力です。私はマップの特定の値に基づいて降順でリストをソートしたいと思います。特定の数値に基づいて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); 
. 
. 
. 
. 

ので、私は100.0のスコアを含むマップが上になるように降順でList<Map<String, String>>をソートしたいです。

私はここ

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の)によって地図をソート](https://stackoverflow.com/questions/109383/sort-a-mapkey-value-by-values-java)でどのように – Flown

+0

を値が浮動小数点数に解析できなかった場合、これは動作するはずです。 –

+0

@Flown私は間違っているかもしれませんが、私はすでにその解決策を試しています。私の問題は、浮動小数点型または浮動小数点型の型キャストで、その浮動小数点値に基づいて1つの特定の浮動小数点値でマップをソートすることです。 – 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.

編集の値を保持する場所:あなたの文字列がfloatに変換し使用することができますかfloatを取ることができます 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"))); 
      } 
     }); 
関連する問題