【问题标题】:Using a method on an object of an arraylist in Java在 Java 中对数组列表的对象使用方法
【发布时间】:2017-01-21 11:36:42
【问题描述】:
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);


}
}

这里是相关代码。我的项目是读取一个包含这些书籍信息的文本文件,并将它们放入书籍对象的数组列表中。我的问题是:我将如何在数组列表中的对象上调用 Book 类中的 isLong() 方法?该方法的要点是,如果一个对象有 >500 个页面,则它返回 true。如果不是,它将返回 false。我只是对逻辑有点困惑,而且我以前从未真正使用过 Arraylist。

【问题讨论】:

  • thelist.get(theindex).isLong()

标签: java class arraylist methods


【解决方案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&lt;...) 计数循环。

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

books.printLongBooks()

还有一些通用提示:

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

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

【讨论】:

    【解决方案2】:

    与其将创建图书列表的逻辑放在构造函数中,不如创建一个名为 getBookCollection() 的方法,该方法返回一个数组列表。

    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
            }
        }
    

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

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

        我假设您有办法在BookCollection 中获取bookList,以及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!");
                }
            }
        }
        

        【讨论】:

          【解决方案5】:

          首先(如果您不想使用流等)您需要从 ArrayList 中获取对象。您可以通过使用ArrayList.get(int index) 然后调用方法或使用 for 每个循环来实现:

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

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

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

          【讨论】:

            【解决方案6】:

            您在这里所做的是创建了一个 decorator (BookCollection),它包装了一个带有附加功能的 ArrayList(在这种情况下,一个基于文件预填充它的构造函数)。这为您提供了两种如何在List 中使用Book 的选项:

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

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

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

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

            【讨论】:

              猜你喜欢
              • 2018-08-19
              • 2018-10-21
              • 2012-04-21
              • 2012-02-07
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-05-26
              • 2017-08-28
              相关资源
              最近更新 更多