实现类似节点java的图

时间:2014-11-27 23:21:02

标签: java

对于我计算机科学课程中的一个项目,我必须实现有向加权图。由于我们只允许使用邻接列表而不是邻接矩阵,因此我决定创建一个包含我的数据的Node类,以及一个用于保存其所有边的树集,因为项目规定边必须是使用我的图形实例化的任何数据的自然排序进行排序。我的Node类看起来像这样:

private class Node<V extends Comparable<V>> {
  private V data;
  private TreeSet<Edge> edges = new TreeSet<Edge>();

  public Node(V data) {
      this.data = data;
  }
}

我的图形本身也是一个包含Node类型对象的树集。但是,我不能使用我的add方法添加到图表中,如下所示:

private boolean addVertex(V vertex) {
    Iterator iter = graph.iterator();
    Node check;

    while (iter.hasNext()) {
        check = (Node) iter.next();
        if (check.data.compareTo(vertex) == 0)
            return false;
    }

    Node n = new Node(vertex);
    graph.add(n);
    return true;
}

我如何才能使我的代码使用Node类实例化的数据的自然顺序将Node添加到我的图表类中?

**编辑 所以基于彼得所说的,我能够为我的问题提出一个解决方案(某种程度)。由于每个项目规定的边缘必须按照节点中保存的数据的自然顺序进行迭代,因此我在边缘类中创建了一个compareTo方法,该方法使用数据的compareTo方法。它看起来像这样:

private class Edge<V extends Comparable<V>> implements Comparable<V> {
  private int weight;
  private boolean visited;
  //This is the data held in the node the edge ends at
  private V endNode;

  public Edge(V dest, int weight) {
      visited = false;
      endNode = dest;
      this.weight = weight;
  }

public int compareTo(Edge<V> e) {
    if (endNode.compareTo((V) e.endNode) < 0)
        return -1;
    else if (endNode.compareTo((V) e.endNode) == 0)
        return 0;
    else
        return 1;
}
}

不幸的是,当我尝试这样做时,我得到两个错误。其中一个说&#34;类型参数V隐藏了类型V&#34;另一个说我必须实现Comparable.compareTo(V)方法,即使我在我的代码中明确地这样做了。我能够找到关于第一个错误的一些信息,其中说我可能会收到该错误,因为我在代码中的某个地方使用了V作为具体类型,然而,这对我来说并不是很有帮助,因为我不会完全理解它。我在我的Node类中做到了这一点并没有发生任何事情,为什么我在Edge类中遇到错误?任何帮助将不胜感激。

同时声明Node和Edge的类定义为

public class Graph<V extends Comparable<V>>

如果这有助于任何人

1 个答案:

答案 0 :(得分:1)

维基百科页面http://en.wikipedia.org/wiki/Adjacency_list是一个很好的起点。 此外,谷歌为此&#34; Goodrich和Tamassia邻接&#34;。 这也是一个很好的起点。

由于您的图表是加权和定向的,这意味着您可以/应该与每个Vertex其传出(或者传入)Edge的列表相关联。然后Edge是其两个顶点(起始顶点和结束顶点)的有序对,以及您可能想要存储在其中的任何其他信息(例如其权重)。那就是你需要的东西。

在我看来,你所指的自然顺序是关于边缘,而不是关于顶点。但你也可以对顶点进行排序。

您还可以拥有Graph课程。 Graph可以只是您的顶级容器类,它可以让您快速访问,例如:1)Vertex给定其ID /名称(或用于识别它的任何数据),2 )Edge给出例如它的起点和终点顶点,其他方法等。

一般来说,你的代码到目前为止看起来还不错。我的意思是你似乎走在了正确的轨道上。