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值)
的功能。如果该包是以正派的方式构建的(我从糟糕的文档中对此表示怀疑),那么该方法只会在具有值的顶点不存在的情况下创建一个新顶点;否则,它将返回valuevalue
的现有顶点
但是,我无法从非文档中判断包是否真的假设给定值只有一个顶点,以及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);
}