2011-09-14 45 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()?