gpt4 book ai didi

java - 当两个以上的值具有相同的排序属性时,按值对 Java TreeMap 进行排序不起作用

转载 作者:行者123 更新时间:2023-12-03 23:14:53 25 4
gpt4 key购买 nike

我想根据值的某些属性对 Java TreeMap 进行排序。具体来说,我想对 TreeMap<Integer, Hashset<Integer>> 进行排序基于 Hashset<Integer> 的大小.为了实现这一点,我做了以下工作:

比较器类:

private static class ValueComparer implements Comparator<Integer> {
private Map<Integer, HashSet<Integer>> map = null;
public ValueComparer (Map<Integer, HashSet<Integer>> map){
super();
this.map = map;
}

@Override
public int compare(Integer o1, Integer o2) {
HashSet<Integer> h1 = map.get(o1);
HashSet<Integer> h2 = map.get(o2);

int compare = h2.size().compareTo(h1.size());

if (compare == 0 && o1!=o2){
return -1;
}
else {
return compare;
}
}
}

使用示例:
TreeMap<Integer, HashSet<Integer>> originalMap = new TreeMap<Integer, HashSet<Integer>>();

//load keys and values into map

ValueComparer comp = new ValueComparer(originalMap);
TreeMap<Integer, HashSet<Integer>> sortedMap = new TreeMap<Integer, HashSet<Integer>>(comp);
sortedMap.putAll(originalMap);

问题:

这在 originalMap 时不起作用包含超过 2 个相同大小的值。对于其他情况,它可以正常工作。当映射中的两个以上值具有相同大小时,新排序映射中的第三个值为 null 并在我尝试访问它时抛出 NullPointerException。

我无法弄清楚问题是什么。如果有人能指出,我会很好。

更新:
这是一个在两个值具有相同大小时有效的示例: http://ideone.com/iFD9c
在上面的例子中,如果你取消注释第 52-54 行,这段代码将会失败——这就是我的问题所在。

最佳答案

更新:您无法返回 -1来自 ValueComparator只是因为你想避免重复的键不被删除。查看 Comparator.compare 的合约.

当您通过 ComparatorTreeMap您计算一个("new")位置来放置条目。 TreeMap 中不能存在(计算的) key 多次。 .

如果要对 orginalMap 进行排序通过值的大小,您可以执行以下操作:

public static void main(String[] args) throws Exception {

TreeMap<Integer, HashSet<Integer>> originalMap =
new TreeMap<Integer, HashSet<Integer>>();

originalMap.put(0, new HashSet<Integer>() {{ add(6); add(7); }});
originalMap.put(1, new HashSet<Integer>() {{ add(6); }});
originalMap.put(2, new HashSet<Integer>() {{ add(9); add(8); }});


ArrayList<Map.Entry<Integer, HashSet<Integer>>> list =
new ArrayList<Map.Entry<Integer, HashSet<Integer>>>();
list.addAll(originalMap.entrySet());

Collections.sort(list, new Comparator<Map.Entry<Integer,HashSet<Integer>>>(){
public int compare(Map.Entry<Integer, HashSet<Integer>> o1,
Map.Entry<Integer, HashSet<Integer>> o2) {

Integer size1 = (Integer) o1.getValue().size();
Integer size2 = (Integer) o2.getValue().size();
return size2.compareTo(size1);
}
});

System.out.println(list);
}

关于java - 当两个以上的值具有相同的排序属性时,按值对 Java TreeMap 进行排序不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7673064/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com