2016-12-08 3 views
0

Я работаю над простой программой, которая читает текстовый файл, содержащий названия книг и соответствующий ссылочный номер. Каждый набор информации должен быть превращен в объект книги, чтобы впоследствии его можно было отсортировать. Однако в текущем коде, когда должна создаваться новая книга, она повторно использует оригинальную книгу. Я добавил счетчик класса Book для отслеживания количества объектов Book.ArrayList повторно использует один объект вместо создания новых

Программа должна создать новый объект книги, используя название книги и соответствующий ссылочный номер. Что я могу изменить/добавить, чтобы исправить эту проблему?

Основное Класс

private static ArrayList<Book> books = new ArrayList(); 

    public static void main(String[] args) { 
     String path = "src//booklist.txt"; 
     boolean endOfFile = false; 

     // try/catch for reading the file 
     try { 
      FileReader fr = new FileReader(path); 
      BufferedReader br = new BufferedReader(fr); 

      while (!endOfFile) { 
       String line = br.readLine(); 

       if (line == null) { 
        endOfFile = true; 
       } else { 
        books.add(new Book(null, 0)); 
        books.get(books.size() - 1).setRefNum(Integer.parseInt(line)); 

        String bookTitle = br.readLine(); 
        books.get(books.size() - 1).setTitle(bookTitle); 
       } 
       System.out.println(books.get(books.size() - 1).toString()); 
      } 
      // Closing reader and displaying results 
      br.close(); 
     } catch (IOException e) { 
      System.out.println(e.toString()); 
     } 
    } 
} 

Книга Класс

private String bookTitle; 
private int refNum; 
private int numBooks; 

public Book(String title, int referenceNumber) { 
    this.bookTitle = title; 
    this.refNum = referenceNumber; 
    this.numBooks++; 
} 

public String getTitle() { 
    return this.bookTitle; 
} 

public void setTitle(String title) { 
    this.bookTitle = title; 
} 

public int getRefNum() { 
    return this.refNum; 
} 

public void setRefNum(int referenceNumber) { 
    this.refNum = referenceNumber; 
} 

public int getNumBooks() { 
    return this.numBooks; 
} 

public String toString() { 
    String message = "Book Title: " + this.bookTitle 
      + "\nReference #: " + this.refNum 
      + "\nBook #: " + this.numBooks 
      + "\n"; 
    return message; 
} 

Текстовый документ (booktitles.txt)

1 
The Adventures of Tom Sawyer 
2 
Huckleberry Finn 
4 
The Sword in the Stone 
6 
Stuart Little 
10 
Treasure Island 
12 
The Secret Garden 
14 
Alice's Adventures in Wonderland 
20 
Twenty Thousand Leagues Under the Sea 
24 
Peter Pan 
26 
Charlotte's Web 
31 
A Little Princess 
32 
Little Women 
33 
Black Beauty 
35 
The Merry Adventures of Robin Hood 
40 
Robinson Crusoe 
46 
Anne of Green Gables 
50 
Little House in the Big Woods 
52 
Swiss Family Robinson 
54 
The Lion, the Witch and the Wardrobe 
56 
Heidi 
66 
A Winkle in Time 
100 
Mary Poppins 

Выходной ток

Book Title: The Adventures of Tom Sawyer 
Reference #: 1 
Book #: 1 

Book Title: Huckleberry Finn 
Reference #: 2 
Book #: 1 

Book Title: The Sword in the Stone 
Reference #: 4 
Book #: 1 

Book Title: Stuart Little 
Reference #: 6 
Book #: 1 

Book Title: Treasure Island 
Reference #: 10 
Book #: 1 

Book Title: The Secret Garden 
Reference #: 12 
Book #: 1 

Book Title: Alice's Adventures in Wonderland 
Reference #: 14 
Book #: 1 

Book Title: Twenty Thousand Leagues Under the Sea 
Reference #: 20 
Book #: 1 

Book Title: Peter Pan 
Reference #: 24 
Book #: 1 

Book Title: Charlotte's Web 
Reference #: 26 
Book #: 1 

Book Title: A Little Princess 
Reference #: 31 
Book #: 1 

Book Title: Little Women 
Reference #: 32 
Book #: 1 

Book Title: Black Beauty 
Reference #: 33 
Book #: 1 

Book Title: The Merry Adventures of Robin Hood 
Reference #: 35 
Book #: 1 

Book Title: Robinson Crusoe 
Reference #: 40 
Book #: 1 

Book Title: Anne of Green Gables 
Reference #: 46 
Book #: 1 

Book Title: Little House in the Big Woods 
Reference #: 50 
Book #: 1 

Book Title: Swiss Family Robinson 
Reference #: 52 
Book #: 1 

Book Title: The Lion, the Witch and the Wardrobe 
Reference #: 54 
Book #: 1 

Book Title: Heidi 
Reference #: 56 
Book #: 1 

Book Title: A Winkle in Time 
Reference #: 66 
Book #: 1 

Book Title: Mary Poppins 
Reference #: 100 
Book #: 1 

Желаемая Выход

Book Title: The Adventures of Tom Sawyer 
Reference #: 1 
Book #: 1 

Book Title: Huckleberry Finn 
Reference #: 2 
Book #: 2 

Book Title: The Sword in the Stone 
Reference #: 4 
Book #: 3 

Book Title: Stuart Little 
Reference #: 6 
Book #: 4 

Book Title: Treasure Island 
Reference #: 10 
Book #: 5 

Book Title: The Secret Garden 
Reference #: 12 
Book #: 6 

Book Title: Alice's Adventures in Wonderland 
Reference #: 14 
Book #: 7 

Book Title: Twenty Thousand Leagues Under the Sea 
Reference #: 20 
Book #: 8 

Book Title: Peter Pan 
Reference #: 24 
Book #: 9 

Book Title: Charlotte's Web 
Reference #: 26 
Book #: 10 

Book Title: A Little Princess 
Reference #: 31 
Book #: 11 

Book Title: Little Women 
Reference #: 32 
Book #: 12 

Book Title: Black Beauty 
Reference #: 33 
Book #: 13 

Book Title: The Merry Adventures of Robin Hood 
Reference #: 35 
Book #: 14 

Book Title: Robinson Crusoe 
Reference #: 40 
Book #: 15 

Book Title: Anne of Green Gables 
Reference #: 46 
Book #: 16 

Book Title: Little House in the Big Woods 
Reference #: 50 
Book #: 17 

Book Title: Swiss Family Robinson 
Reference #: 52 
Book #: 18 

Book Title: The Lion, the Witch and the Wardrobe 
Reference #: 54 
Book #: 19 

Book Title: Heidi 
Reference #: 56 
Book #: 20 

Book Title: A Winkle in Time 
Reference #: 66 
Book #: 21 

Book Title: Mary Poppins 
Reference #: 100 
Book #: 22 
+0

В чем ваши вопросы? – Nico

+0

Обновлено сообщение, явно задавая вопрос. – jxshu

+0

В чём проблема? –

ответ

2

Я думаю, вы поняли код

books.add(new Book(null, 0)); 
books.get(books.size() - 1).setRefNum(Integer.parseInt(line)); 
String bookTitle = br.readLine(); 
books.get(books.size() - 1).setTitle(bookTitle); 

Это создает новый Book каждый раз. Однако это неэффективно. Рассмотрим

Book b = new Book(null,0); 
books.add(b); 
b.setRefNum(Integer.parseInt(line)); 
String bookTitle = br.readLine(); 
b.setTitle(bookTitle); 

Переменная b является локальным по отношению к петле. Еще лучше, если использовать конструктор

String bookTitle = br.readLine(); 
Book b = new Book(bookTitle,Integer.parseInt(line)); 
books.add(b); 

Как осветленной вопрос:

numBooks является переменной экземпляра, так что есть один экземпляр для каждой книги. Вам нужно использовать books.size() для получения количества записей в списке. Удалите numBooks из класса Book, в этом нет необходимости.

+0

Если код просто неэффективен, то что они говорят о повторном использовании одной и той же книги? – 4castle

+0

Это часть того, что неясно. Приведенный код не использует один и тот же объект «Книга». –

+0

Я предполагаю, что проблема заключается в том, что когда я выхожу из книг, все они дают вывод книги №: 1. Я добавил желаемый результат в вопрос. – jxshu

0

использовать соответствующие значения в конструкторе, так что dummy книга не должны быть добавлены и впоследствии got для того, чтобы быть обновлено

String bookTitle = br.readLine(); 
books.add(new Book(bookTitle, Integer.parseInt(line))); 
0

Заменить строки

books.add(new Book(null, 0)); 
books.get(books.size() -1).setRefNum(Integer.parseInt(line)); 

String bookTitle = br.readLine(); 
books.get(books.size() - 1).setTitle(bookTitle); 

По

String bookTitle = br.readLine(); 
books.add(new Book(bookTitle,Integer.parseInt(line))); 

Ваша проблема заключается в классе книги с numBooks.You не нужно. Вы можете использовать книги arrayList и свой индекс для вывода.

+0

Я сделал это, однако вывод все еще показывает каждую книгу как книгу №1. Должно быть более 1 книги. У меня есть вопрос обновления с текущим выходом и желаемым выходом. – jxshu

+0

Этот код работает. Ваша проблема в классе Book с numBooks. Думаю, тебе это не нужно. Вы можете использовать книги arryList и свой индекс для вывода. См. Мой обновленный ответ. –

0

Счетчик, добавленный в класс Book, не является статическим. Таким образом, он будет уникальным для каждого нового экземпляра объекта Book. Таким образом, это всегда будет одно.

private int numBooks; 

public Book(String title, int referenceNumber) { 
    this.bookTitle = title; 
    this.refNum = referenceNumber; 
    this.numBooks++; 
} 

Вы не видите несколько книг, добавленных из объекта книг ArrayList?

System.out.println(books.get(books.size() - 1).toString()); 
0

В соответствии с вашим текущим выпуском заголовок меняется, но книга № не меняется.

numBooks статический. Static переменные связаны с классом вместо экземпляров класса, поэтому одна и та же переменная будет использоваться для всех объектов, которые являются экземплярами одного и того же класса.