2009-12-08 3 views
1

"Book"객체를 노드로 유지하는 Graph를 구현하고 있습니다. 책이 키워드를 공유하면 노드가 연결됩니다. 각 도서의 키워드는 Book 클래스의 Vector에 보관됩니다. 이를 위해 3 개의 클래스를 만들었습니다.잘못된 Vector.size()가 반환되었습니다.

1) 책 2) 정점 3) 그래프

정점 클래스는 예약 개체를 보유하고 있으며 또한 다른 모든 정점 오브젝트 (키워드를 공유하는 다른 책을)를 포함하는 벡터를 가지고있다. 드라이버에서 나는 책을 만들어 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"); 

} 

책의 정보는 드라이버의 파일에서 읽혀 책 객체에 삽입됩니다. 나는이 정보가 그래프에 정확하고 올바르게 삽입되어 읽히도록 노력하고 있습니다. 내 문제는 그래프 클래스의 "showKeywords()"메서드 내에서 키워드 Vector의 크기를 가져 오려고 할 때 발생합니다. getBookwords() .get (0) .getBook(). getKeywords(). size()는 addBook() 메서드의 똑같은 명령이 올바른 크기를 반환 할 때 0을 반환합니다. Book 클래스에서 getTitle() 또는 getAuthor()와 같은 접근 자 메서드를 구현했으며 showKeywords() 메서드 내에서 제대로 작동합니다. 키워드 벡터는 showKeywords() 메소드 내 유일한 문제 인 것 같습니다. 여기서 내가 뭘 잘못하고 있니?

여기에 작동해야처럼

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

귀하의 질문에 대한 대답이 아니지만 ArrayList 사용을 고려하십시오 – Bozho

+0

처음에 강사가 제안한 벡터가 있지만 결국 그 선택을 남겨 둡니다. 나는 그의 제안을하기로 결심했다. ArrayList는 어떤 이점을 제공합니까? 감사. – Vaheh

+2

ArrayList가 동기화되지 않기 때문에 조금 더 잘 수행됩니다. 또한 더 많은 인터페이스를 구현하므로 더 편리하게 사용할 수 있습니다. –

답변

2

나에게 보이는 .... 내 드라이버 클래스입니다 - (같은 실수 정적 변수를 사용하여) 분명히 아무 문제가 없습니다. 문제를 보여주는 짧지 만 완전한 프로그램을 제공 할 수 있습니까? 오류는 다른 곳에서 발생할 가능성이 있습니다 - 예를 들어 setKeywords(new Vector<String>())을 호출하고 있습니까?

그런데 Vector 대신에 ArrayList을 사용하는 이유는 무엇입니까? 또한 setKeywords(String key)은 아마도 addKeyword이라고해야 할 것입니다 ...

EDIT : 좋아요, 코드가 게시되었으므로 이제는 Vector이라는 단일 인스턴스 만 만들었습니다. 그런 다음 모든 행에 대해 해당 인스턴스를 재사용하고 끝에 정리합니다.

키워드를 안에 넣고 루프를 개 지정하고 반복 할 때마다 새 인스턴스를 만든 다음 나중에 지우지 마십시오.

코드를 최대한 읽기 쉽도록 (그리고 이런 종류의 일을 피하기 위해) 가능한 한 가장 좁은 가능한 범위에서 모든 변수를 처음 사용할 때 선언하는 것이 좋습니다.

+0

아, ArrayList는 더 일반적으로 사용되지 않았습니다. 자바가 1.0 일 때 니퍼 (nipper) 였을 때 돌아왔다. 벡터는 우리가 가진 전부 였고 감사했다 ;-) 나는 C++ 마이 그 레이 터를 조금 더 행복하게 만들어주기 위해 Vector라고 불렀다. – Benj

+0

아직 setKeywords() 메소드의 인스턴스를 사용하지 않았습니다. 어느 정적 변수도 없습니다. 내 드라이버에 붙여 넣을 가장 적절한 방법은 600 자까지 허용됩니다. – Vaheh

+0

@Vahe : 대신 질문을 편집하십시오 ... 가능한 한 많이 샘플 코드를 잘라 내면 정말 짧습니다. 그렇게하면 문제를 직접 발견 할 수 있습니다. –

0

당신이 객체의 그래프에서 길을 잃은 것 같아요 :) unit tests을 사용하여 코드가 어떻게 동작해야 하는지를 결정하고 실제로 예상대로 동작하는지 확인하는 것이 좋습니다. 테스트를 통해 작은 예제를 만든 다음 다양한 getter가 올바른 결과를 반환하는지 확인할 수 있습니다.

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(); 
} 
+0

Graph.java에 삽입하면 작동합니다. 그러나 Driver 클래스에서 동일한 것을 시도하면 원래 오류가 발생합니다. – Vaheh

+0

이 스 니펫을 Graph.java에 삽입했습니다. 그런 다음 books.test()를 통해 호출합니다. (책은 Graph 객체 임). – Vaheh

+0

이제는 문제가 Vector # size와 관련이 없으며 응용 프로그램의 다른 부분에 있거나 드라이버 클래스에있을 수도 있습니다. –

0

당신이 복사 생성자 도서 (책)이 필요합니까 무엇을 위해? 아마 당신은 책 자체 대신 책의 사본을 당신의 소장품에 넣을 수 있습니까?

관련 문제