Java 树映射-基于键的动态排序元素

Java 树映射-基于键的动态排序元素,java,collections,Java,Collections,我想使用HashMap对元素进行排序。所以我选择树形图。下面的代码给了我奇怪的答案,比我预期的要多 public class MapTest { public static class Key implements Comparable<Key>{ private String key; private int count; public Key(String key, int count){ this.key = key; t

我想使用HashMap对元素进行排序。所以我选择树形图。下面的代码给了我奇怪的答案,比我预期的要多

public class MapTest {

  public static class Key implements Comparable<Key>{
    private String key;
    private int count;

    public Key(String key, int count){
      this.key = key;
      this.count = count;
    }

    @Override
    public int hashCode() {
      return key.hashCode();
    }

    @Override
    public boolean equals(Object obj) {
      return key.equals(obj);
    }

    @Override
    public int compareTo(Key o) {
      return count - o.count;
    }
  }

  public static void main(String[] args) {
    Map<Key, Integer> map = new TreeMap<>();

    Key c = new Key("c", 4);

    map.put(new Key("a", 6), 1);
    map.put(new Key("b", 8), 1);
    map.put(c, 1);
    map.put(new Key("d", 2), 1);

    for(Map.Entry<Key, Integer> entry : map.entrySet()){
      System.out.println(entry.getKey().key);
    }

    //map.remove(c);
    map.put(c, null);
    c.count = 0;
    map.put(c, 1);

    for(Map.Entry<Key, Integer> entry : map.entrySet()){
      System.out.println(entry.getKey().key);
    }

  }
}
公共类映射测试{
公共静态类密钥实现了可比较的{
私钥;
私人整数计数;
公钥(字符串键、整数计数){
this.key=key;
this.count=计数;
}
@凌驾
公共int hashCode(){
return key.hashCode();
}
@凌驾
公共布尔等于(对象obj){
返回键等于(obj);
}
@凌驾
公共整数比较(键o){
返回计数-o.count;
}
}
公共静态void main(字符串[]args){
Map Map=newtreemap();
键c=新键(“c”,4);
地图放置(新键(“a”,6),1);
地图放置(新键(“b”,8),1);
图.put(c,1);
地图放置(新键(“d”,2),1);
对于(Map.Entry:Map.entrySet()){
System.out.println(entry.getKey().key);
}
//地图。删除(c);
map.put(c,null);
c、 计数=0;
图.put(c,1);
对于(Map.Entry:Map.entrySet()){
System.out.println(entry.getKey().key);
}
}
}
如果我使用
map.remove()
并添加元素,它是有序的。否则,它总是按顺序返回元素 d c a b

为什么上面的代码不起作用?put(键,null)应删除该值,如果插入新值,则必须正确排序?

put(键,null)
不会从映射中删除键。它仍然在映射中,只是映射到null。您想
删除(键)

在映射中用作键的对象实际上应该是不可变的。在将密钥放入地图后,您正在修改该密钥-但地图没有检测该密钥并移动密钥的机制,因此您意识到密钥最终位于无效位置

这可能会混淆
映射
,以至于它认为键根本不存在于映射中,因为它会去寻找它应该在哪里,而它不在那里