2013-03-02 5 views
3

Здравствуйте, у меня возникли проблемы с распечаткой элементов в моем ArrayList. Я могу распечатать его в моем методе PatronBorrow, но в PatronList и PatronReturn он ничего не печатает. Может ли кто-нибудь сказать мне, что не так с кодом? Спасибо всем большоеArrayList не хранит объекты

package proj1; 

import java.util.ArrayList; 
import java.util.List; 


public class Patron { 

private int id; 
private Book book; 
private List<Book> books; 

public Patron(int id){ 
    this.id = id; 
    books = new ArrayList<Book>(); 
} 

public int getID(){ 
    return id; 
} 

public List<Book> getBooks(){ 
    return books; 
} 

public void PatronBorrow(String b){ 
    book = new Book(b); 
    books.add(book); 
    System.out.println("Patron " + id + " has borrowed " + book.getTitle()); 
} 

public void PatronReturn(String b){ 
    for(Book book : books){ 
     if(book.getTitle().equals(b)){ 
      books.remove(book); 
      System.out.println("Patron " + id + " has borrowed " +  book.getTitle()); 
     } 
    } 
} 

public void PatronList(){ 
    for(Book b : books){ 
     System.out.println("Patron " + id + " has borrowed " + books.size() + " item(s)"); 
     System.out.println(b); 
    } 
} 

}

package proj1; 

import java.io.FileInputStream; 
import java.io.FileNotFoundException; 
import java.util.Scanner; 

public class Project1 { 

public static boolean isNumeric(String str){ 
    for(char c : str.toCharArray()){ 
     if(Character.isDigit(c)){ 
      return true; 
     } 
    } 
    return false; 
} 

public static void main(String[] args){ 

    String command; 
    String line; 
    Patron patron; 
    int patronID; 
    String title; 
    String newTitle; 
    String infile = args[0]; 

    if (args.length != 1){ 
     throw new IllegalArgumentException("Enter in file name"); 
    } 

    try{ 
     Scanner file = new Scanner(new FileInputStream(infile)); 
     while(file.hasNext()){ 
      command = file.next(); 
      if(isNumeric(command)){ 
       patronID = Integer.parseInt(command); 
       patron = new Patron(patronID); 
       command = file.next(); 
       if(command.equals("borrow")){ 
        title = file.nextLine(); 
        newTitle = title.substring(2, title.length() - 1); 
        patron.PatronBorrow(newTitle); 
       }else if(command.equals("return")){ 
        title = file.nextLine(); 
        newTitle = title.substring(2, title.length() - 1); 
        patron.PatronReturn(newTitle); 
       }else if(command.equals("list")){ 
        patron.PatronList(); 
       } 
      }else{ 

      } 
     } 

    }catch (FileNotFoundException e) { 
     System.out.println("File not found" + e.getMessage()); 
     System.exit(0); 
    } 


} 

}

+0

Я не понимаю, почему он не будет печатать ничего в PatronList. Вы уверены, что вы не повторно инициализируете объект Patron или можете вызывать методы до того, как вы добавите объект книги? –

+0

В зависимости от того, как вы вызываете эти методы, последние два метода в классе связаны с итерацией по пустым спискам? Также обратите внимание, что вы удаляете единственную книгу, которую вы добавляете в PatronReturn? Чего вы намереваетесь достичь? – 2013-03-02 23:13:24

+0

Можете ли вы добавить свой основной метод к вопросу, чтобы мы могли видеть ваш код, вызывающий этот класс. – Jyro117

ответ

4

В цикле, который использует Patron класс, вы создаете новый (пустой) Patron каждый раз.

Что вы хотите сделать, если хотите переключиться между покровителями, есть Map<Integer, Patron> patrons или тому подобное в вашей основной функции. Вместо того, чтобы создавать каждый раз new Patron(patronID), извлеките его из patrons и создайте только один (и сохраните его на карте), если его еще нет.

(Насколько ваш Patron класса, хотя, вы можете обнаружить, если вы делаете некоторые реальные испытания этого класса, который PatronReturn часто вызывает исключение при удалении книги. ConcurrentModificationException, а именно, потому что вы удаляете из списка вы повторяете в то время. Просто голова.)

+0

oooooh я вижу, что вторая строка в моем файле имеет еще один идентификатор, поэтому он создает новую ...... Спасибо! Также как карта отличается от списка? – user2127726

+0

@ user2127726: Карта представляет собой таблицу поиска. С помощью 'Map ' вы храните 'Patron' таким образом, чтобы вы могли найти его с помощью идентификатора целого числа. – cHao

+0

Что касается того, почему вам нужна карта, а не список ... это действительно зависит от характера ваших идентификаторов патронов. Если в номерах будут пробелы или они составят несколько цифр, список будет плохой идеей, потому что вы будете тратить кучу места на слоты списка, которые никогда не могут иметь значения. Карты лучше, если ваше пространство поиска является редким. Если идентификаторы всегда будут похожи на 1, 2, 3 и т. Д., Тогда список будет работать, но это сильно зависит от данных; только один код не позволяет мне делать это предположение. – cHao

Смежные вопросы