本文介绍了按值数对Guava Multimap进行排序的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

如果我有一个Guava Multimap,我如何根据给定密钥的值数对这些条目进行排序?

If I have a Guava Multimap, how would I sort the entries based on the number of values for the given key?

例如:

Multimap<String, String> multiMap = ArrayListMultimap.create();
multiMap.put("foo", "1");
multiMap.put("bar", "2");
multiMap.put("bar", "3");
multiMap.put("bar", "99");

鉴于此,在迭代multiMap时,我如何才能获得bar条目(因为bar有3个值,而foo只有1个?

Given this, when iterating over multiMap, how would I get the "bar" entries to come first (since "bar" has 3 values vs. only 1 for "foo")?

推荐答案

提取列表中的条目,然后对列表进行排序:

Extract the entries in a list, then sort the list :

List<Map.Entry<String, String>> entries = new ArrayList<Map.Entry<String, String>>(map.entries());
Collections.sort(entries, new Comparator<Map.Entry<String, String>>() {
    @Override
    public int compare(Map.Entry<String, String> e1, Map.Entry<String, String> e2) {
        return Ints.compare(map.get(e2.getKey()).size(), map.get(e1.getKey()).size());
    }
});

然后迭代条目。

编辑:

如果您想要的实际上是迭代内部地图的条目(条目< String,Collection< String>> ),然后执行以下操作:

If what you want is in fact iterate over the entries of the inner map (Entry<String, Collection<String>>), then do the following :

List<Map.Entry<String, Collection<String>>> entries =
    new ArrayList<Map.Entry<String, Collection<String>>>(map.asMap().entrySet());
Collections.sort(entries, new Comparator<Map.Entry<String, Collection<String>>>() {
    @Override
    public int compare(Map.Entry<String, Collection<String>> e1,
                       Map.Entry<String, Collection<String>> e2) {
        return Ints.compare(e2.getValue().size(), e1.getValue().size());
    }
});

// and now iterate
for (Map.Entry<String, Collection<String>> entry : entries) {
    System.out.println("Key = " + entry.getKey());
    for (String value : entry.getValue()) {
        System.out.println("    Value = " + value);
    }
}

这篇关于按值数对Guava Multimap进行排序的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-21 12:02