我正在尝试制作一个图表,读取txt文件并将单词放入图表中,但它不能重复(如果文件中有两个相同的单词)
这是我的代码(使用 JUNG API)
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Scanner;
import java.util.Stack;
import edu.uci.ics.jung.graph.DirectedSparseGraph;
import edu.uci.ics.jung.graph.Graph;
import edu.uci.ics.jung.graph.SparseMultigraph;
import edu.uci.ics.jung.graph.util.EdgeType;
public class Main {
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
Scanner scan = null;
/*i have a class named 'Palavra' that returns me a string(did that cause // i'll use the class to implement some things at the word) */
Stack<Palavra> palavras = new Stack<Palavra>(); // pilha para delimitar
// tamanho do grafo
// Read txt
try {
scan = new Scanner(new File("C:\\Users\\Auryon.AURYON-PC\\Desktop\\Aula1\\teste.txt"));
} catch (FileNotFoundException e) {
e.printStackTrace();
}
/*int i = 0;*/
Graph<Palavra, Relacao> g = new SparseMultigraph<Palavra, Relacao>();
//我创建的最后一个类(将是我的单词关系验证)
Relacao tipo_palavra = new Relacao("connect");
# 这是问题所在
while (scan.hasNextLine()) {
String s = scan.next();
Palavra word = new Palavra(s);
if (palavras.contains(word)) {
s = scan.next();
} else {
palavras.push(word);
g.addVertex(word);
}
/*
* if (i > 0) { g.addEdge(tipo_palavra,word,palavras.lastElement());
* //multiple edges }
*/
}
System.out.println(g);
System.out.println(palavras.size());
}
}
block 引用> block 引用>MY NEW UPDATE
import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import java.util.Scanner; import java.util.Stack; import edu.uci.ics.jung.graph.DirectedSparseGraph; import edu.uci.ics.jung.graph.Graph; import edu.uci.ics.jung.graph.SparseMultigraph; import edu.uci.ics.jung.graph.util.EdgeType; public class Main { public static void main(String[] args) throws IOException { // TODO Auto-generated method stub Scanner scan = null; Stack<Palavra> palavras = new Stack<Palavra>(); // Graph Size Stack // Read txt try { scan = new Scanner(new File("C:\\Users\\Auryon.AURYON-PC\\Desktop\\Aula1\\teste.txt")); } catch (FileNotFoundException e) { e.printStackTrace(); } Graph<Palavra, Relacao> g = new SparseMultigraph<Palavra, Relacao>(); Relacao tipo_palavra = new Relacao("connect"); String s = scan.next(); Palavra word = new Palavra(s); palavras.push(word); g.addVertex(word); while (scan.hasNextLine()) { s = scan.next(); word = new Palavra(s); //THE REAL PROBLEM g.addVertex(word); g.addEdge(tipo_palavra, word, palavras.lastElement()); palavras.push(word); } System.out.println(g); System.out.println(palavras.size()); } }
最佳答案
正如@DivDiff所说,尚不完全清楚你的问题是什么,但听起来你期望输入文件中的单词数与你创建的图中的顶点数相同(其中顶点是单词)。
简短的版本是:只要文件中的每个单词只出现一次,那就是真的。如果 word
尚未出现在图表中,并且您执行以下操作:
boolean result1 = g.addVertex(word);
boolean result2 = g.addVertex(word);
那么result1
将为true
(图表已修改),result2
将为false
(图表未修改)已修改),如 addVertex 的文档中指定.
这个约束(顶点必须是唯一的)允许顶点用作图内部数据结构的键,更重要的是用作 getNeighbors() 等方法的参数。
更新:您下面的评论表明您看到的实际问题是您尝试添加具有不同端点的相同边缘。
特别是,您有一个边对象 (tipo_palavra
),并且您反复将该边添加到具有不同端点的图形中。这是行不通的:每个边缘对象必须是唯一的。
如果边本身除了作为连接两个顶点的手段之外对您没有任何意义,那么您有两个主要选择:
(1) 为每对端点生成一个新的边对象,例如,让边是一个 Integer 并每次递增它:
g.addEdge(i++, word1, word2);
(2) 使用不同的库来表示不需要显式边缘对象的图,例如 Guava's common.graph library (在 v20 RC1 中可用),特别是 Graph 类型。
关于java - 将不同的txt文件单词转化为图表(使用JUNG lib),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40164026/