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合作过。
答案 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
内的BookCollection
和Book
的名称?
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)。有几种方法可以使它发挥作用。
books.bookList
答案 5 :(得分:0)
您在此处所做的是创建一个装饰器(BookCollection
),它将ArrayList
包含其他功能(在这种情况下,是一个预先构造的构造函数)根据文件填写它)。这为您提供了两种如何在Book
中使用List
的选项:
通过getter使List
可访问,然后解决。使陈述时间长,但这对于少量使用是可以接受的:
if(books.getBooks().get(index).isLong()) {
//The book at index is long
}
更常见的是,您将在装饰器中创建提供常用功能的方法,如下所示:
public boolean isLong(int index) {
return bookList.get(index).isLong();
}
然后,您只需从业务逻辑中调用装饰器方法。您甚至可以制作更复杂的方法,例如GhostCat提供的方法。