Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 对哈希集集合进行排序_Java_Sorting_Hashmap - Fatal编程技术网

Java 对哈希集集合进行排序

Java 对哈希集集合进行排序,java,sorting,hashmap,Java,Sorting,Hashmap,如果这是重复的,我很抱歉,但我找不到任何具体回答这个问题的答案 我有一个HashMap,它包含一个字符串键和一个设置值。我想根据集合的长度对地图中的值进行排序。考虑: HashMap<String, Set<String>> myMap; 我希望能够从myMap高效地获取列表{“D”、“C”、“A”、“B”、“E”}(它指定集合从最大到最小的顺序) 除了创建一个实现Set并重写compareTo方法的包装器类之外,还有其他方法可以根据集合的长度对集合进行排序吗 编辑:我

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

我有一个HashMap,它包含一个字符串键和一个设置值。我想根据集合的长度对地图中的值进行排序。考虑:

HashMap<String, Set<String>> myMap;
我希望能够从
myMap
高效地获取列表
{“D”、“C”、“A”、“B”、“E”}
(它指定集合从最大到最小的顺序)

除了创建一个实现Set并重写
compareTo
方法的包装器类之外,还有其他方法可以根据集合的长度对集合进行排序吗


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

HashMaps是不可排序的。它们是为按键查找值而优化的。

因为
HashMaps
不维护internal order,你不能那样做。你能做的最好的事情就是用
map.values()
获取所有的值,迭代它,看看哪个值最长

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;
   }
}
HashMap=。。。
集合值=map.values();
int maxLen=Integer.MIN_值;
设置winner=null;
对于(V:值){
如果(v.size()>maxLen){
获胜者=v;
}
}
T
V
是任意类型。在您的例子中,T等于String,V等于Set

除了创建实现Set并重写compareTo方法的包装器类之外,还有没有其他方法可以根据集合的长度对集合进行排序

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

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());
    }
});
List mySets=newarraylist(myMap.values());
排序(新的比较器(){
@凌驾
公共整数比较(集合a、集合b){
返回整数。比较(a.size(),b.size());
}
});
…但是现在您丢失了每个集合的对应键。因此,让我们对地图条目进行排序

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());
    }
});
List entries=newarraylist(myMap.entrySet());
entries.sort(新的Comparator(){
@凌驾
公共整数比较(条目a、条目b){
返回整数.compare(a.getValue().size(),b.getValue().size());
}
});
您现在可以“轻松”获得钥匙:

List<String> sortedKeys = new ArrayList<>();
for (Entry<String, Set<String>> e : entries) {
    sortedKeys = e.getKey();
}
List sortedKeys=new ArrayList();
对于(条目e:条目){
sortedKeys=e.getKey();
}

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

我将创建一个自定义对象来保存
集和
字符串。让类实现
Comparable
,实现使用设置大小。然后使用
列表来填充一个d
Collections.sort()
以获得所需的结果

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());
    }
}

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

“我想能够从
myMap
高效地获取集合
{D”,“C”,“A”,“B”,“E”}
。”你是指列表吗?集合是无序的,所以您最好在那里使用
myMap.keySet()
。是的,对不起。本质上,我只希望列表按该顺序排列。集合可以排序,例如TreeSet是一个SortedSetLook,此时这不是排序,而是确定具有最大大小的键控值。只是一个提示(因为我删除了我的答案)我的实现既没有排序也没有从映射中复制值。它使用了一个
TreeSet
,而不是
TreeMap
。这会给我一个最长的,但为了得到排序列表,这将是一个n^2操作。我可以为集合实现一个log(n)排序算法,同时保持键的正确顺序,但我只是想知道是否有Java提供的更简单的方法。太棒了!谢谢我来试一试,看看它对我是否有效。你是说“条目.排序(…)”而不是mySets?
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());
    }
}
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);
}
D
C
A
B
E