排序的地图不允许删除

时间:2013-11-25 10:17:59

标签: java map

我之前搜索了一种根据值对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仍在地图中

2 个答案:

答案 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的。