2013-03-02 2 views
3

안녕하세요. 내 ArrayList에 항목을 인쇄하는 데 문제가 있습니다. 내 PatronBorrow 메서드에서 인쇄 할 수 있지만 PatronList 및 PatronReturn에서는 아무것도 인쇄하지 않습니다. 누구든지 코드에 무엇이 잘못되었는지 말해 줄 수 있습니까? 당신이 Patron 때마다 새로운 (빈)을 만들고있는 Patron 클래스를 사용하여 루프에서 매우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에서 추가하는 유일한 책을 삭제한다는 사실에 유의하십시오. 성취하고자하는 것은 무엇입니까? –

+0

질문에 main 메소드를 추가하여이 클래스를 호출하는 코드를 볼 수 있습니까? – Jyro117

답변

4

여러분 모두 감사합니다.

고객님이 원하는 기능을 사용 하시려면 고객님의 주 기능에 Map<Integer, Patron> patrons 등이 있으시면 언제든지 이용하실 수 있습니다. new Patron(patronID)을 매번 생성하는 대신 patrons에서 검색하고 아직 생성하지 않은 경우에만지도를 만들어지도에 저장하십시오.

(당신이 책을 제거 할 때 PatronReturn 종종 예외가 발생하는 것이 그 클래스의 진짜 테스트를 할 경우 지금까지 당신의 Patron 클래스로하지만, 당신이 찾을 수 있습니다. ConcurrentModificationException을, 즉, 당신이 목록에서 제거하고 원인 당신은 그때 반복하고 있습니다. 그냥 머리를 올리십시오.)

+0

오우 이제 내 파일의 두 번째 줄에 다른 ID가 있으므로 새로운 것을 만듭니다. 감사합니다! 지도가 목록과 어떻게 다른가요? – user2127726

+0

@ user2127726 : 맵은 정렬의 찾아보기 테이블입니다. 'Map '을 사용하면, 정수 ID로 찾을 수있는 방식으로'Patron'을 저장합니다. – cHao

+0

왜 목록 대신지도를 원하겠습니까? 실제로는 수호 ID의 특성에 따라 다릅니다. 숫자에 간격이 있거나 길이가 여러 자리 인 경우 List는 좋지 않은 아이디어입니다. 값이없는 목록 슬롯에 많은 공간을 낭비하게됩니다. 조회 공간이 그렇게 희박한 경우지도가 더 좋습니다. ID가 항상 1, 2, 3 등과 같으면 목록도 작동하지만 데이터에 크게 의존합니다. 코드만으로는 그 가정을 할 수 없습니다. – cHao

관련 문제