2016-02-06 2 views
2

Я играю с HashMaps на Java, и я наткнулся на то, что я не могу понять. Я тоже не могу найти дубликат моей проблемы.HashMap - не возвращает правильное значение для равных ключей

Я пытаюсь создать карту с ключом VertexPair и значением Integer. VertexPair - это просто контейнер для 2 Vertex объектов. Когда я создаю 2 VertexPairs, которые имеют одинаковый хеш-код и равны (проверены .equals()), они не возвращают одно и то же значение с моей карты.

Вот мой код:

HashMap<VertexPair, Integer> edges = new HashMap<VertexPair, Integer>(); 

Vertex a = new Vertex("A"); 
Vertex b = new Vertex("B"); 

VertexPair p = new VertexPair(a, b); 
VertexPair m = new VertexPair(a, b); 
VertexPair n = new VertexPair(b, a); 
VertexPair check = new VertexPair(a, new Vertex("C")); 

System.out.println(p.equals(m)); 
System.out.println(p.equals(n)); 
System.out.println(m.equals(n)); 
//just to be sure equals is working 
System.out.println(p.equals(check)); 

System.out.println(m.hashCode()); 
System.out.println(n.hashCode()); 
System.out.println(p.hashCode()); 
//just to be sure hashCode is working 
System.out.println(check.hashCode()); 

edges.put(p, 10); 

System.out.println(edges.get(p)); 
System.out.println(edges.get(m)); 
System.out.println(edges.get(n)); 

И это выход:

true 
true 
true 
false 
1757285723 
1757285723 
1757285723 
-425440240 
10 
null 
null 

Вот класс VertexPair по запросу:

public final class VertexPair { 

    private HashSet<Vertex> set; 

    public VertexPair(Vertex a, Vertex b) { 
     if(a==null || b==null) 
      throw new NullPointerException("Vertexes must not be null"); 
     set = new HashSet<Vertex>(); 
     set.add(a); 
     set.add(b); 
    } 

    public HashSet<Vertex> getVertexes() { 
     return set; 
    }  

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

    public boolean equals(VertexPair p) { 
     if(!(p instanceof VertexPair)) 
      return false; 
     if(p==this) 
      return true; 
     return set.equals(p.getVertexes()); 

    } 


} 

Может кто-то пожалуйста, объясните мне, что происходит на? Должно быть, я неправильно понимаю что-то важное в HashMaps. Заранее спасибо :)

ответ

2

Заменить

public boolean equals(VertexPair p) { 

с

@Override 
public boolean equals(Object p) {