我正在实现一个Graph,它将“Book”对象作为其节点。如果图书共享关键字,则连接节点。每本书的关键字都保存在Book类的Vector中。为此,我创建了3个类。
1)书籍2)顶点3)图
Vertex类保存Book对象,还有一个包含所有其他Vertex对象的Vector(其他共享关键字的书籍)。在Driver中,我创建了这本书,将其传递给Graph,然后将其插入Vertex,最后将Vertex插入名为“bookGraph”的Vector中。
public final class Graph {
private Vector<Vertex> bookGraph = new Vector<Vertex>();
private int bookCounter = 0;
public Graph() {
}
public void addBook(Book bk) {
Vertex vtx = new Vertex(bk);
bookGraph.add(vtx);
bookCounter++;
System.out.println("Book #1 has " + bookGraph.get(0).getBook().getKeywords().size() + " keywords");
// addAdjVertices();
}
public void showKeywords() {
System.out.println("Book #1 is " + bookGraph.get(0).getBook().getKeywords().size() + " keywords");
}
书籍中的信息从驱动程序中的文件中读取并插入到书籍对象中。我正在尝试确保正确读取此信息并正确插入图表。尝试在Graph类中的“showKeywords()”方法中获取关键字Vector的大小时,会出现问题。 bookGraph.get(0).getBook()。getKeywords()。size()在addBook()方法中完全相同的命令返回正确的大小时返回0。我已经在Book类中实现了访问器方法,如getTitle()或getAuthor(),并且这些方法在showKeywords()方法中正常工作。关键字矢量似乎是showKeywords()方法中唯一的问题。我在这里做错了什么?
这是我的Driver类....
boolean fileopen = false;
String title, author, keys;
long isbn_number;
Vector<String> keywords = new Vector<String>();
String filename = "books.txt";
String[] keywordTokens;
Scanner fin = null;
Scanner input = new Scanner (System.in);
Graph books = new Graph();
try {
fin = new Scanner (new FileReader(filename));
String fline;
fileopen = true;
System.out.println("Reading books.txt...");
while (fin.hasNextLine()) {
fline = fin.nextLine();
title = fline;
fline = fin.nextLine();
author = fline;
fline = fin.nextLine();
isbn_number = Long.parseLong(fline);
fline = fin.nextLine();
keywordTokens = fline.split(",");
for (int x = 0; x < keywordTokens.length; x++) {
keywords.add(keywordTokens[x]);
}
Book tempBook = new Book(title,author,isbn_number,keywords);
books.addBook(tempBook);
keywords.clear();
if (fin.hasNextLine()) fline = fin.nextLine();
}
books.showKeywords();
System.out.println("Ready.");
}
catch (FileNotFoundException e) {
System.out.println("FILE NOT FOUND!");
}
答案 0 :(得分:2)
在我看来它应该工作 - 没有什么明显的错误(比如意外使用静态变量)。你能提供一个简短但完整的程序来证明这个问题吗?错误可能在其他地方 - 例如,你在某处调用setKeywords(new Vector<String>())
吗?
顺便使用Vector
而不是更常见的ArrayList
的任何理由?我还建议setKeywords(String key)
可能应该被称为addKeyword
而不是......
编辑:好的,既然您已经发布了代码,那么显而易见:您只创建了Vector
的单个实例。然后,您将为每一行重用该实例,并在最后清除它。
只需在循环中声明你的关键字变量,在每次迭代时创建一个新实例,然后不要清除它。
为了使你的代码尽可能可读(并避免这种事情),我建议你尽可能在最初使用时声明每个变量,并尽可能缩小范围。
答案 1 :(得分:1)
您可以尝试使用此代码段并检查错误是否仍然存在:
public void test() {
Vector<String> keywords = new Vector<String>();
keywords.add("keyword");
Book bk = new Book("Author", "Title", 12345, keywords);
Graph bookGraph = new Graph();
bookGraph.addBook(bk);
bookGraph.showKeywords();
}
答案 2 :(得分:0)
我认为你在对象图中丢失了:)我建议使用unit tests来确定你的代码应该如何表现,并确保它确实按照你期望的方式运行。测试可以构建小例子,然后检查各种getter,看看它们是否返回正确的结果。
答案 3 :(得分:0)
您需要什么样的复制构造函数Book(Book)?也许你把书的副本而不是书籍本身放到你的收藏中?