2011-09-14 68 views
1

我已經定義了一個自定義邊和頂點類型以用於無向稀疏圖。問題是圖形添加了我不想要的多條邊。例如,考慮下面的代碼:JUNG - 自定義邊和頂點問題

UndirectedSparseGraph<Vertex, Edge> graphX = new UndirectedSparseGraph<Vertex, Edge>(); 
graphX.addEdge(new Edge("1#2"), new Vertex("1"), new Vertex("2")); 
graphX.addEdge(new Edge("1#2"), new Vertex("1"), new Vertex("2")); 
graphX.addEdge(new Edge("2#1"), new Vertex("2"), new Vertex("1")); 
graphX.addEdge(new Edge("1#3"), new Vertex("1"), new Vertex("3")); 
graphX.addEdge(new Edge("1#4"), new Vertex("1"), new Vertex("4")); 

我有意加入的兩個相似的邊緣(第一的)。我已經爲我創建的兩個類(即Edge和Vertex)重寫了一個equals方法,但是該圖假定邊的頂點是不同的,並添加了所有這些邊。 下面是輸出:

Vertices:1,4,1,1,2,1,1,2,2,3 
Edges:1#3[1,3] 1#4[1,4] 1#2[1,2] 1#2[1,2] 2#1[2,1] 

那麼,我究竟做錯了什麼?

PS。 FYI這裏是我創建的類:

public class Vertex { 

    private String id; 
    //More info in the future 

    public Vertex(String id){ 
     this.id = id; 
    } 

    public String getId() { 
     return id; 
    } 

    public void setId(String id) { 
     this.id = id; 
    } 

    @Override 
    public boolean equals(Object obj){ 
     return ((Vertex) obj).id.equals(this.id); 
    } 

    @Override 
    public String toString(){ 
     return this.id; 
    } 

} 

public class Edge { 

    private String id; 
    private double weight; 

    public Edge(String id, double weight){ 
     this.id = id; 
     this.weight = weight; 
    } 

    public Edge(String id){ 
     this.id = id; 
     this.weight = -1; 
    } 

    public String getId() { 
     return id; 
    } 

    public void setId(String id) { 
     this.id = id; 
    } 

    public double getWeight() { 
     return weight; 
    } 

    public void setWeight(double weight) { 
     this.weight = weight; 
    } 

    @Override 
    public boolean equals(Object obj){ 
     return ((Edge) obj).id.equals(this.id); 
    } 

    @Override 
    public String toString(){ 
     return this.id; 
    } 

} 

回答

2

這是一個經典的Java問題,而不是JUNG特有的。基本上,你重寫equals()而不是hashCode(),所以你的hashcode不是「與equals()一致」。看到這個問題及其答案更多的背景和一些解決方案:How to ensure hashCode() is consistent with equals()?