Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何知道我的图中是否存在顶点?_Java_Data Structures_Graph - Fatal编程技术网

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

Java 如何知道我的图中是否存在顶点?,java,data-structures,graph,Java,Data Structures,Graph,我正在制作一个从文件加载图形的方法。这很简单,但是如果有重复的顶点,这个方法也会插入到图中,所以我试图避免这种情况 这是我当前的代码: public static Graph<ElementoDecorado<Integer>, String> loadGraphFromFile(File f) { boolean v1_exists = false, v2_exists = false; Graph<ElementoDecorado

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

这是我当前的代码:

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;
    }
公共静态图形loadGraphFromFile(文件f){
布尔值v1_exists=false,v2_exists=false;
图g=新的邻接柱状图();
顶点v1,v2,aux=null;
扫描仪fr;
试一试{
fr=新扫描仪(f);
while(fr.hasNextLine()){
v1=g.insertVertex(新的ElementoDecorado(fr.nextInt());
v2=g.insertVertex(新的ElementoDecorado(fr.nextInt());
对于(顶点v:g.顶点()){
如果(v等于(v1)){
/*aux=v;
v1_存在=真*/
}
如果(v等于(v2)){
/*aux=v;
v2_exists=true*/
}
}
g、 插入边缘(v1,v2,“边缘”);
v1_exists=v2_exists=false;
}
}catch(filenotfounde异常){
e、 printStackTrace();
}
返回g;
}
我不知道在这两个“如果”中写些什么。我试图删除顶点,如果它们相等,但显然这不起作用,因为最后我的图形将为空:S

对于顶点接口

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

在图形中插入顶点之前,询问给定顶点键是否已有
字符串

vertex = new ElementoDecorado<Integer>(fr.nextInt());
if(graph.get(key) != null) { 
    //it exists, don't insert it
} else { 
    g.insertVertex(vertex)
}
vertex=newelementodecorado(fr.nextInt());
如果(graph.get(key)!=null){
//它存在,请不要插入它
}否则{
g、 插入顶点(顶点)
}
了解自己的数据结构。问问你自己,这个图表是由什么组成的?这只是一个映射:

ElementoDecorado<Integer> => String
ElementoDecorado=>String

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

问题是,在检查是否需要添加顶点之前,您正在将顶点添加到图形中。 首先,不要直接添加两个顶点,只需读取它们:

v1 = new ElementoDecorado<Integer>( fr.nextInt() );
v2 = new ElementoDecorado<Integer>( fr.nextInt() );
对于
v2
,也是如此。最后,如果且仅当
v1\u存在时
为false,则添加顶点:

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

g.insertEdge( v1, v2, "edge" );
// etc
您还可以进行一些优化,例如在找到两个顶点时停止的
,但这应该可以做到


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

您应该首先检查
graph.insertVertex(V值)
的功能。如果该包是以正派的方式构建的(我从糟糕的文档中对此表示怀疑),那么该方法只会在具有
值的顶点不存在的情况下创建一个新顶点;否则,它将返回value
value
的现有顶点

但是,我无法从非文档中判断包是否真的假设给定值只有一个顶点,以及
insertVertex
的行为是否正确

以下是一些代码,以防
insertVertex
未检查重复:

(为了可读性,我将
ElementoDecorado
替换为
Integer

while(fr.hasNextLine()){
int nodeId1=fr.nextInt();
int nodeId2=fr.nextInt();
顶点顶点顶点1=空;
顶点顶点顶点2=空;
对于(顶点v:g.顶点()){
int nodeId=v.element();
if(nodeId==nodeId1)
vert1=v;
else if(nodeId==nodeId2)//假设不能有nodeId1==nodeId2
vert2=v;
}
if(vert1==null)
vert1=g.insertVertex(nodeId1);
if(vert2==null)
vert2=g.insertVertex(nodeId2);
g、 插入边缘(顶点1、顶点2、空);
}

文档非常糟糕,但是如果需要,应该添加顶点的是
graph.insertEdge(v1,v2,o)
。文档没有说明实际发生了什么。我想这个图可以有很多相同整数的顶点。但是你想把它限制为每个整数的一个顶点。这可能是第一件要检查的事情,看看它是否是这样做的。@弗朗西斯实际上,我认为即使
insertEdge
添加了顶点,它也不起作用,因为v1和v2都是新的顶点,即使它们的整数值与某些现有顶点相同。我在
Graph
中看不到
get
方法,我是否遗漏了什么?它看起来像是一张地图,但你是对的,弗朗西斯,我想我可能是跳枪了。
// right anfter the for-each
if ( !v1_exists ) {
    g.addVertex( v1 );
}
if ( !v1_exists ) {
    g.addVertex( v2 );
}

g.insertEdge( v1, v2, "edge" );
// etc
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);
 }