Java 树映射-基于键的动态排序元素
我想使用HashMap对元素进行排序。所以我选择树形图。下面的代码给了我奇怪的答案,比我预期的要多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
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。您想删除(键)
在映射中用作键的对象实际上应该是不可变的。在将密钥放入地图后,您正在修改该密钥-但地图没有检测该密钥并移动密钥的机制,因此您意识到密钥最终位于无效位置
这可能会混淆映射
,以至于它认为键根本不存在于映射中,因为它会去寻找它应该在哪里,而它不在那里