Sorting a collection of HashSets
如果这是一个副本,我道歉,但我找不到任何具体回答这个问题的答案。
我有一个hashmap,其中包含一个字符串键和一个设置值。我想根据集合的长度对地图中的值进行排序。考虑:
1 |
包含:
1 2 3 4 5 | {"A", {"Dukmerriot","King","Pumpkin"}} {"B", {"Steve"}} {"C", {"Jib","Jab","John","Julie"}} {"D", {"Apple","Amy","Unicorn","Charlie","Raptor"}} {"E", {}} |
号
我希望能够有效地从
除了创建一个实现set并重写
编辑:我应该指定不需要使用哈希映射来维护这个集合。我可以使用treemap或其他东西,但我不确定这是否可行,因为set不能实现可比性。
Is there a way to sort a collection of sets based on their length other than creating a wrapper class that implements Set and overriding the compareTo method?
号
这是一种完全可行的方法。您也可以使用
1 2 3 4 5 6 7 | 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()); } }); |
号
…但是现在您已经丢失了每个集合的对应键。让我们对地图条目进行排序!
1 2 3 4 5 6 7 |
现在你可以"轻松"拿到钥匙:
1 2 3 4 | List<String> sortedKeys = new ArrayList<>(); for (Entry<String, Set<String>> e : entries) { sortedKeys = e.getKey(); } |
。
这个列表不会是密钥的实况视图,但如果这是一个可接受的限制,它将是您的最佳选择。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | 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); } |
。
印刷品
1 2 3 4 5 | D C A B E |
。
我使用了谷歌的guava的不变集,只是为了缩短代码。你可能想看看他们的多重映射,因为你会发现它很有用。
我将创建一个自定义对象来同时保存
1 2 3 4 5 6 7 8 9 10 11 | class A implements Comparable { Set set; String string; ...constructor etc.... @Override public int compare(A a,A b) { return Integer.compare(a.set.size(), b.set.size()); } } |
由于
1 2 3 4 5 6 7 8 9 10 | HashMap<T, V> map = ... Collection<V> values = map.values(); int maxLen = Integer.MIN_VALUE; Set<String> winner = null; for(V v : values) { if(v.size() > maxLen) { winner = v; } } |
哈希图不可排序。它们经过优化,可以通过键查找值。