如何知道我的图中是否存在顶点?

时间:2011-12-27 18:11:27

标签: java data-structures graph

我正在制作一个从文件加载图表的方法。这很简单,但是如果有重复的顶点,方法也会插入到图中,所以我试图避免这种情况。

这是我目前的代码:

public static Graph<ElementoDecorado<Integer>, String> loadGraphFromFile(File f) {
        boolean v1_exists = false, v2_exists = false;
        Graph<ElementoDecorado<Integer>, String> g = new AdjacencyListGraph<ElementoDecorado<Integer>, String>();
        Vertex<ElementoDecorado<Integer>> v1, v2, aux = null;
        Scanner fr;

        try {
            fr = new Scanner(f);

            while(fr.hasNextLine()) {
                v1 = g.insertVertex(new ElementoDecorado<Integer>(fr.nextInt()));
                v2 = g.insertVertex(new ElementoDecorado<Integer>(fr.nextInt()));

                for(Vertex<ElementoDecorado<Integer>> v : g.vertices()) {
                    if(v.equals(v1)) {

                        /*aux = v;
                        v1_exists = true;*/
                    }
                    if(v.equals(v2)) {
                        /*aux = v;
                        v2_exists = true;*/
                    }
                }

                g.insertEdge(v1, v2, "edge");

                v1_exists = v2_exists = false;
            }
        } catch(FileNotFoundException e) {
            e.printStackTrace();
        }

        return g;
    }

我不知道写两个ifs的内容。我试图删除顶点,如果它们相等,但显然这不起作用,因为最后我的图形将为空:S

This is the manual page用于Vertex界面。

欢迎任何帮助。 谢谢,圣诞快乐!

3 个答案:

答案 0 :(得分:2)

您应首先检查graph.insertVertex(V value)的作用。如果软件包构建得很好(我怀疑文档很差),那么只有当value的顶点不存在时,该方法才会创建一个新的顶点。否则它返回值value的现有顶点。

但是我无法从非文档中判断出包是否真的假定给定值有一个顶点,insertVertex是否正常运行。

以下是insertVertex未检查重复的情况下的一些代码:

(为了便于阅读,我将ElementoDecorado<Integer>替换为Integer

while(fr.hasNextLine()) {
   int nodeId1 = fr.nextInt();
   int nodeId2 = fr.nextInt();
   Vertex<Integer> vert1 = null;
   Vertex<Integer> vert2 = null;

   for(Vertex<Integer> v : g.vertices()) {
      int nodeId = v.element();
      if(nodeId == nodeId1) 
         vert1 = v;
      else if (nodeId == nodeId2) // assumes can't have nodeId1 == nodeId2
         vert2 = v;
    }
    if (vert1 == null)
       vert1 = g.insertVertex(nodeId1);
    if (vert2 == null)
       vert2 = g.insertVertex(nodeId2);

    g.insertEdge(vert1, vert2, null);
 }

答案 1 :(得分:0)

在图中插入顶点之前,询问给定顶点键是否已存在String值。

vertex = new ElementoDecorado<Integer>(fr.nextInt());
if(graph.get(key) != null) { 
    //it exists, don't insert it
} else { 
    g.insertVertex(vertex)
}

了解您自己的数据结构。问问自己,图表是由什么组成的?它只是一个映射:

ElementoDecorado<Integer> => String

也不要将变量命名为:g。它没有任何意义。

答案 2 :(得分:0)

问题是你要将顶点添加到图形 BEFORE ,检查是否需要添加它们。 首先,不要直接添加两个顶点,只需读取它们:

v1 = new ElementoDecorado<Integer>( fr.nextInt() );
v2 = new ElementoDecorado<Integer>( fr.nextInt() );

然后,在for中,检查顶点是否存在,就像您尝试的那样。您的if可能如下所示:

if( !v1_exists && v.equals( v1 ) ) {
    v1 = v;
    v1_exists = true;
}

同样适用于v2。最后,当且仅当v1_exists为假时,才添加顶点:

// right anfter the for-each
if ( !v1_exists ) {
    g.addVertex( v1 );
}
if ( !v1_exists ) {
    g.addVertex( v2 );
}

g.insertEdge( v1, v2, "edge" );
// etc

您还可以进行一些优化,例如在找到两个顶点时停止for,但应该这样做。

请注意,这可能是一种更好的方法,但我不知道这些类。