我之前搜索了一种根据值对TreeMaps进行排序的方法,能够找到一个能够执行此操作的函数,但现在看来remove()方法出现了问题,尝试了各种不同的方法来使用键删除但是它不起作用,说实话我不完全理解排序功能,有人可以解释一下是什么问题吗?
守则:
public static void main(String[] args) {
TreeMap<String,Integer> theTree = new TreeMap<String,Integer>();
theTree.put("A", 5);
theTree.put("B", 3);
theTree.put("F", 1);
theTree.put("D", 5);
theTree.put("E", 6);
theTree.put("C", 7);
System.out.println(theTree.toString());
Map<String,Integer> sortedTree = new TreeMap<String,Integer>();
sortedTree = sortByValues(theTree);
System.out.println(sortedTree.toString());
for (Map.Entry<String, Integer> entry : sortedTree.entrySet())
{
if(entry.getKey().equals("A"))
sortedTree.remove(entry.getKey());
}
System.out.println(sortedTree.toString());
theTree = new TreeMap<String,Integer>(sortedTree);
theTree.remove("B");
System.out.println(theTree.toString());
}
public static <K, V extends Comparable<V>> Map<K, V> sortByValues(final Map<K, V> map) {
Comparator<K> valueComparator = new Comparator<K>() {
public int compare(K k1, K k2) {
int compare = map.get(k2).compareTo(map.get(k1));
if (compare == 0) return 1;
else return compare;
}
};
Map<K, V> sortedByValues = new TreeMap<K, V>(valueComparator);
sortedByValues.putAll(map);
return sortedByValues;
}
输出:
{A=5, B=3, C=7, D=5, E=6, F=1}
{C=7, E=6, A=5, D=5, B=3, F=1}
{C=7, E=6, A=5, D=5, B=3, F=1}
{A=5, C=7, D=5, E=6, F=1}
A仍在地图中
答案 0 :(得分:4)
在你的比较器中,你正在删除任何返回0的机会(if (compare == 0)return 1
)因此当你去除时,你的输入值永远不会有任何机会等于集合中的值,什么都不会除去。如果你没有特别的理由去除它们被认为是平等的机会,那么就从你的比较器中删除那一行。
答案 1 :(得分:1)
您只能在Iterator
期间通过map traversal
删除
Map<String,Integer> sortedTree = new TreeMap<String,Integer>();
System.out.println(sortedTree.toString());
Iterator<Entry<String,Integer>> itr = sortedTree.entrySet().iterator();
while(itr.hasNext())
{
Entry<String,Integer> entry = itr.next();
if(entry.getKey().equals("A"))
itr.remove();
}
map.remove
在没有迭代的情况下可以正常工作。如果没有通过ConcurrentModificationException
进行迭代,则删除会抛出Iterator
。许多其他收藏也是如此。
这就是我所说的TreeMap
javadoc:
集合的迭代器方法返回的迭代器 所有这个类的“集合视图方法”都返回了 失败快速:如果地图在之后的任何时间进行结构修改 迭代器以任何方式创建,除非通过迭代器自己创建 删除方法,迭代器将抛出一个 ConcurrentModificationException的。