返回了不正确的Vector.size()

时间:2009-12-08 10:41:29

标签: java graph vector

我正在实现一个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!");
 }

4 个答案:

答案 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)?也许你把书的副本而不是书籍本身放到你的收藏中?