【问题标题】:Sort a list of maps by value in java在java中按值对地图列表进行排序
【发布时间】:2016-03-28 17:04:42
【问题描述】:

我有一张地图列表。我无法预测每张地图的关键。键可以是任意两位数字,它将根据请求而改变。但是值包含从请求到请求的唯一值。现在我需要根据每个键的值对这个映射列表进行排序。我已经尝试过类似下面的方法,

List<Map<String,String>> listOfMaps = new ArrayList<>();
Map<String,String> map1 = new HashMap<>();
Map<String,String> map2 = new HashMap<>();
map1.put("key1","value1");
map2.put("key2","value1");


listOfMaps.add(map1);
listOfMaps.add(map2);

sort(listOfMaps);

 Collections.sort(listOfMaps, new Comparator<Map<String, String>>() {
        public int compare(final Map<String, String> o1, final Map<String, String> o2) {
            return o1.get("key").compareTo(o2.get("key"));
        }
    });

由于“键”可能因地图而异,我似乎无法使用上面的代码。 我也试过这些例子。

How to Sort a List of Maps by two Categories?

Sorting list of maps based on a value

由于我无法预测关键,我无法从这些帖子中找到答案。有人可以帮忙吗?

【问题讨论】:

  • 您的所有地图都只包含一个条目吗?
  • 我不太明白 - 也许您可以添加一个测试用例来演示示例输入以及您期望的输出?
  • 那么您是对所有地图中的键还是值进行排序?而且,您是否对列表中的所有地图进行了排序?
  • @Paul Boddington 是的,只正确一个键和一个值
  • @ pczeus 我正在尝试对值进行排序。是的,列表中的所有地图

标签: java sorting collections comparator


【解决方案1】:

假设每个地图元素只包含一个条目,下面的示例应该可以工作:

List<Map<String, String>> list = new ArrayList<>();
//Add entries
Collections.sort(list, new Comparator<Map<String, String>>() {
    public int compare(Map<String, String> o1, Map<String, String> o2) {
        Collection<String> values1 = o1.values();
        Collection<String> values2 = o2.values();
        if(!values1.isEmpty() && !values2.isEmpty()){
            return values1.iterator().next().compareTo(values2.iterator().next());
        }else{
            return 0;
        }
    }
});

【讨论】:

  • 看起来这可能是在正确的轨道上,除了它只检查第一个值,而不是地图中的所有值。
  • 是的,我已经在我的回答中指定了,看看“假设下”部分:)
  • @Darshan 谢谢它的工作,非常感谢你。第二个 o1 应该是 o2 :)
【解决方案2】:

虽然有时需要创建一个只有一个键和一个值的MapCollections.singletonMap 用于此目的),但看起来Map 并不适合您的情况。使用具有两个字段的自定义类更有意义,如下所示:

// This is immutable. You may prefer to make fields non-final and add setters.
// You may also want to override equals() and hashCode().
final class StringPair {

    private final String key;
    private final String value;

    StringPair(String key, String value) {
        this.key = key;
        this.value = value;
    }

    @Override
    public String toString() {
        return "[" + key + ", " + value + "]";
    }
}

那么你可以这样做:

List<StringPair> list = new ArrayList<>();
list.add(new StringPair("K2", "V2"));
list.add(new StringPair("K1", "V1"));     
Collections.sort(list, new Comparator<StringPair>() 
    @Override
    public int compare(StringPair o1, StringPair o2) {
        return o1.value.compareTo(o2.value);
    }     
});
System.out.println(list);    // Prints [[K1, V1], [K2, V2]]

【讨论】:

  • @Paul,谢谢,但就我而言,我必须使用地图.. :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-21
  • 2021-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多