对HashSets集合进行排序

Dev*_*vin 0 java sorting hashmap

如果这是重复,我道歉,但我找不到任何具体回答这一特定问题的答案.

我有一个HashMap,其中包含一个与Set值配对的字符串键.我想根据集合的长度对地图中的值进行排序.考虑:

HashMap<String, Set<String>> myMap;
Run Code Online (Sandbox Code Playgroud)

包含:

{"A", {"Dukmerriot", "King", "Pumpkin"}}  
{"B", {"Steve"}}
{"C", {"Jib", "Jab", "John", "Julie"}}
{"D", {"Apple", "Amy", "Unicorn", "Charlie", "Raptor"}}
{"E", {}}
Run Code Online (Sandbox Code Playgroud)

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

除了创建一个实现Set和覆盖compareTo方法的包装类之外,有没有办法根据它们的长度对一组集合进行排序?

编辑:我应该指定我不需要使用HashMap来维护这个集合.我可以使用TreeMap或其他东西,但我不确定这是否可能,因为Set没有实现Comparable.

Mat*_*all 6

除了创建实现Set和覆盖compareTo方法的包装类之外,有没有办法根据它们的长度对集合集合进行排序?

这是一种完全可行的方法.你也可以使用Comparator:

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());
    }
});
Run Code Online (Sandbox Code Playgroud)

...但是现在你丢失了每套的相应密钥.所以我们只是对地图条目进行排序!

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());
    }
});
Run Code Online (Sandbox Code Playgroud)

你现在可以"轻松"获得钥匙:

List<String> sortedKeys = new ArrayList<>();
for (Entry<String, Set<String>> e : entries) {
    sortedKeys = e.getKey();
}
Run Code Online (Sandbox Code Playgroud)

此列表不是密钥的实时视图,但如果这是可接受的限制,那么这将是您最好的选择.