【问题标题】:Sorting a list of Map<String, String> based on a particular numeric value根据特定数值对 Map<String, String> 列表进行排序
【发布时间】:2017-09-26 10:21:46
【问题描述】:

我有一个List&lt;Map&lt;String, String&gt;&gt;。地图的一个特定值是带有小数的数字条目。我希望根据地图的特定值按降序对列表进行排序。

例如:

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&lt;Map&lt;String, String&gt;&gt; 进行排序,使得包含 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”是一个字符串,而我需要将它排序为浮点数。 任何帮助将不胜感激。

【问题讨论】:

  • 如果无法将值解析为浮点数,这应该如何工作?
  • @Flown 我可能错了,但我已经尝试过该解决方案。我的问题是字符串的类型转换为浮动或清晰,根据该浮动值对具有一个特定浮动值的 map 进行排序。

标签: java sorting collections maps


【解决方案1】:

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

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

【讨论】:

  • 他可能不会使用JAVA8
  • 我无法创建单独的类,因为我正在使用 YAML 文件来使密钥动态化。但除此之外,您的解决方案有效。谢谢
【解决方案2】:

为什么需要List Of map,您可以使用List&lt;SomeClass&gt; 并根据需要对其进行排序,其中某些类将为您提供name sex score. 的价值

编辑:您可以使用将字符串转换为浮点数,也可以将 float 作为 Someclass 数据类型,它使您的代码非常简单。

【讨论】:

  • 我发布了一个非常简化的遗留代码版本。我正在使用 yml 使键动态化。请放心,我考虑过单独开设一个课程,但对我来说,目前是不可能的
【解决方案3】:

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

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

【讨论】:

    【解决方案4】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-26
      • 1970-01-01
      • 2015-01-18
      • 1970-01-01
      • 2020-02-26
      • 2011-07-06
      • 2019-05-29
      • 1970-01-01
      相关资源
      最近更新 更多