2014-05-20 4 views
-1

요소의 순서와 함께 HashMap을 사용하고 싶습니다. 그래서 TreeMap을 선택합니다. 코드가 내게 map.remove()를 사용하여 요소를 추가하면 내가TreeMap - 키 기반의 동적 순서 지정 요소

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); 
    } 

    } 
} 

을 기대했던 것보다 이상한 대답을 제공합니다 아래, 그것은 주문한다. 그렇지 않으면 항상 순서대로 요소를 반환합니다. dc a b

위의 코드가 작동하지 않는 이유는 무엇입니까? put (key, null)은 값을 삭제해야하며 새 값이 삽입되면 올바르게 정렬해야합니까?

답변

2

put(key, null)지도에서 키를 제거하지 않습니다. 여전히지도에 있지만 null로 매핑 만합니다. 너 remove(key)하고 싶어.

지도에서 키로 사용되는 객체는 실제로 변경 가능해야합니다. 키를 맵에 넣은 후에 키를 수정하고 있습니다. 그러나 맵에 키를 감지하고 키를 이동하는 메커니즘이 없으므로 키가 유효하지 않은 위치에서 종료됩니다.

이렇게하면 Map을 혼란에 빠뜨릴 수 있습니다.지도에 키가 있다고 생각하지 않는다는 점과 혼란 스럽습니다.