在Java

时间:2016-09-13 19:07:07

标签: java class arraylist methods

public class Book
{
private String isbn, author, area;
private int length;
public Book(String isbn, String author, String area, int length)
{
    this.isbn=isbn;
    this.author=author;
    this.area=area;
    this.length=length;
}
public boolean isLong()
{
    if (length>500)
        return true;
    else 
        return false;
}    
} 
public class BookCollection

{
 private ArrayList<Book> bookList = new ArrayList<Book>();


public BookCollection()throws IOException
{
    Scanner fileScan;
    String oneLine;
    String isbn, author, area;
    int length;

    fileScan = new Scanner (new File("books.txt"));
    while (fileScan.hasNext())
    {
        isbn=fileScan.next();
        author=fileScan.next();
        area=fileScan.next();
        length=fileScan.nextInt();
        bookList.add(new Book(isbn, author, area, length));
    }
}
 public class TestBookCollection
{

public static void main (String[] args)throws IOException
{
    BookCollection books = new BookCollection();
    System.out.println(books);


}
}

这里是相关的代码。我的项目是阅读一个文本文件,其中包含有关这些书籍的信息,并将它们放入书籍对象的arraylist中。我的问题是:如何在arraylist中的对象上调用类Book中的isLong()方法?该方法的要点是,如果对象具有> 500页,则返回true。如果不是,它将返回false。我对这种逻辑感到困惑,之前我从未与Arraylists合作过。

6 个答案:

答案 0 :(得分:1)

您可以向BookCollection添加另一种方法:

public void printLongBooks() {
  for (Book book : bookList) {
    if (book.isLong()) {
       well, book is long ...
    } else {
       obviously, it is short ...
 }

上面使用Java中所谓的“for each”循环样式,您可以使用它来循环每个数组/集合;而不是“旧学校”for (int i=0; i<...)计数循环。

并且在main方法中,您只需调用新方法:

books.printLongBooks()

还有一些通用提示:

A)isLong()可以简化为单行:return length > 500;

B)读取文件中的内容不是您在构造函数中直接执行的操作。相反,您应该为它创建一个专用方法,然后您可以在构造函数

中调用它

答案 1 :(得分:0)

您应该创建一个名为getBookCollection()的方法来返回一个arraylist,而不是将逻辑放在构造函数中创建book列表。

public List<Book> BookCollection()throws IOException
    {

        List<Book> bookList = new ArrayList<Book>();
        //logic to create booklist

        return booklist;
    }

获得图书清单后,您可以运行增强的for循环并检查每本图书中的页面。

for(Book book: bookList){
        if(book.isLong()){
            //logic
        } else {
            //logic
        }
    }

答案 2 :(得分:0)

您可以使用for循环遍历ArrayList的元素,并在每个对象上调用该方法。

for(Book book : bookList){
    boolean isLong = book.isLong();
}

答案 3 :(得分:0)

您有List<Book>,其中List中的每个索引都包含Book。使用List.get(index)方法获取给定Object索引处的List。例如:bookList.get(0)获取索引为0的Book。一旦有了Object,就可以正常使用它。

我认为您可以通过某种方式获取bookList内的BookCollectionBook的名称?

public static void main(String[] args){
    BookCollection books = new BookCollection(); // Make a new BookCollection
    List<Book> booksInCollection = books.getBooksList(); // Get the Books inside BookCollection
    // Go through each book in booksInCollection
    for(int index = 0; index < booksInCollection.size(); index++){
        // Get the Book Object at index
        Book currentBook = booksInCollection.get(index);
        if(currentBook.isLong()){
            System.out.println(currentBook.getName() + " is long!");
        }
    }
}

答案 4 :(得分:0)

首先(如果你不想使用流等),你需要从ArrayList获取对象。您可以使用ArrayList.get(int index)然后调用该方法或使用每个循环来执行此操作:

for(Book book : bookList) {
    System.out.println(book.isLong());
}

问题是您无法从main访问私有字段(bookList)。有几种方法可以使它发挥作用。

  • 在BookCollection中创建一个公共方法
  • 将字段更改为公开,然后直接访问books.bookList
  • 使用BookCollection中的bookList获取getter。
  • 使BookCollection扩展ArrayList

答案 5 :(得分:0)

您在此处所做的是创建一个装饰器BookCollection),它将ArrayList包含其他功能(在这种情况下,是一个预先构造的构造函数)根据文件填写它)。这为您提供了两种如何在Book中使用List的选项:

  1. 通过getter使List可访问,然后解决。使陈述时间长,但这对于少量使用是可以接受的:

    if(books.getBooks().get(index).isLong()) {
        //The book at index is long
    }
    
  2. 更常见的是,您将在装饰器中创建提供常用功能的方法,如下所示:

    public boolean isLong(int index) {
        return bookList.get(index).isLong();
    }
    

    然后,您只需从业务逻辑中调用装饰器方法。您甚至可以制作更复杂的方法,例如GhostCat提供的方法。