首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对HashSets的集合进行排序

对HashSets的集合进行排序
EN

Stack Overflow用户
提问于 2013-02-26 04:34:29
回答 5查看 1.5K关注 0票数 0

如果这是重复的,我很抱歉,但我找不到任何具体回答这个特定问题的答案。

我有一个HashMap,它包含一个与设置值成对的字符串键。我希望根据集合的长度对map中的值进行排序。考虑一下:

代码语言:javascript
复制
HashMap<String, Set<String>> myMap;

包含:

代码语言:javascript
复制
{"A", {"Dukmerriot", "King", "Pumpkin"}}  
{"B", {"Steve"}}
{"C", {"Jib", "Jab", "John", "Julie"}}
{"D", {"Apple", "Amy", "Unicorn", "Charlie", "Raptor"}}
{"E", {}}

我希望能够高效地从myMap获取列表{"D", "C", "A", "B", E"} (指定集合从最大到最小的顺序)。

除了创建实现Set的包装类并覆盖compareTo方法之外,是否有其他方法可以根据集合的长度对集合进行排序?

编辑:我应该指定我不需要使用HashMap来维护这个集合。我可以使用TreeMap之类的,但我不确定这是否可能,因为Set没有实现可比较的。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2013-02-26 05:11:23

代码语言:javascript
复制
final Map<String, Set<String>> map = new HashMap<>();

map.put("A", ImmutableSet.of("Dukmerriot", "King", "Pumpkin"));
map.put("B", ImmutableSet.of("Steve"));
map.put("C", ImmutableSet.of("Jib", "Jab", "John", "Julie"));
map.put("D", ImmutableSet.of("Apple", "Amy", "Unicorn", "Charlie", "Raptor"));
map.put("E", new HashSet<String>());

List<String> keys = new ArrayList<>(map.keySet());
Collections.sort(keys, new Comparator<String>() {

    @Override
    public int compare(String o1, String o2) {
        return Integer.valueOf(map.get(o2).size()).compareTo(map.get(o1).size());
    }
});

for (String key : keys) {
    System.out.println(key);
}

打印

代码语言:javascript
复制
D
C
A
B
E

我使用了Google Guava的ImmutableSet,只是为了使代码简短。你可能想看看他们的Multimap,因为你可能会发现它很有用。

票数 2
EN

Stack Overflow用户

发布于 2013-02-26 04:58:23

除了创建实现Set的包装类并覆盖compareTo方法之外,是否有其他方法可以根据集合的长度对集合进行排序?

这是一种完全可行的方法。您还可以使用Comparator

代码语言:javascript
复制
List<Set<String>> mySets = new ArrayList<>(myMap.values());
mySets.sort(new Comparator<Set<String>>() {
    @Override
    public int compare(Set<String> a, Set<String> b) {
        return Integer.compare(a.size(), b.size());
    }
});

...but现在,您已经丢失了每个集合的相应密钥。因此,让我们只对映射条目进行排序!

代码语言:javascript
复制
List<Entry<String, Set<String>>> entries = new ArrayList<>(myMap.entrySet());
entries.sort(new Comparator<Entry<String, Set<String>>>() {
    @Override
    public int compare(Entry<String, Set<String>> a,Entry<String, Set<String>> b) {
        return Integer.compare(a.getValue().size(), b.getValue().size());
    }
});

现在,您可以“轻松”地获取密钥:

代码语言:javascript
复制
List<String> sortedKeys = new ArrayList<>();
for (Entry<String, Set<String>> e : entries) {
    sortedKeys = e.getKey();
}

这个列表不会是密钥的实时视图,但如果这是一个可接受的限制,它将是您最好的选择。

票数 6
EN

Stack Overflow用户

发布于 2013-02-26 04:36:31

HashMaps是不可排序的。它们针对按键查找值进行了优化。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15075973

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档