根据特定数值对Map <string,string =“”>的列表进行排序

时间:2017-09-26 10:21:47

标签: java sorting collections maps

我有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”是一个字符串,而我需要它作为一个浮点数排序。 任何帮助将不胜感激。

4 个答案:

答案 0 :(得分:3)

如果无法从该地图创建一个类,那么您可以执行以下操作:

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")));
            }
        });

答案 1 :(得分:0)

为什么需要List Of map,您可以使用List<SomeClass>并按照自己的意愿对其进行排序,其中某些课程会为您提供name sex score.的价值

编辑:你可以在float中使用convert你的String,或者可以将 float 作为Someclass数据类型,它可以让你的代码变得非常简单。

答案 2 :(得分:0)

这可能是另一个简单的解决方案。

使用 Float 来解析字符串并使用Float的现有 compare 方法。

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")));
            }
        });

答案 3 :(得分:0)

按特定键的值对地图列表进行排序:

public static void sortMapByKey(List<Map<String, Object>> crList, final String sortKey, final boolean ascending) {
            Collections.sort(crList, new Comparator<Map<String, Object>>() {
                @Override
                public int compare(Map<String, Object> o1, Map<String, Object> o2) {
                    Object obj1 = o1.get(sortKey);
                    Object obj2 = o2.get(sortKey);
                    if (obj1 != null && obj2 != null) {
                        if (ascending)
                            return obj1.toString().compareTo(obj2.toString());
                        else
                            return obj2.toString().compareTo(obj1.toString());
                    } else
                        return 0;
                }
            });
        }