我正在制作一个从文件加载图表的方法。这很简单,但是如果有重复的顶点,方法也会插入到图中,所以我试图避免这种情况。
这是我目前的代码:
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界面。
欢迎任何帮助。 谢谢,圣诞快乐!
答案 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
,但应该这样做。
请注意,这可能是一种更好的方法,但我不知道这些类。