通过调用相应的方法

时间:2015-12-31 10:43:44

标签: java arraylist methods

我在练习Java时遇到了一个问题。

我有一个 Book 类,它存储以下信息:

  

id(int),作者和标题

我有另一个类 BookShelf ,它使用Vector / ArrayList存储一系列书籍,并具有以下方法:

  

addBook:将一个book对象作为输入,将该对象添加到bookshelf中,方法不返回任何内容。

     

returnListOfBooks:不接受任何参数,并按字母顺序返回按标题排序的所有图书的Vector / ArrayList。

     

returnListOfBooksByAuthor:将作者作为输入并返回该作者的书籍的Vector / ArrayList

我坚持的问题是:

  

主程序BookShelfApp,执行以下操作:

     

•创建Book对象的ArrayList。

     

•创建BookShelf对象。

     

•每次将书放在书架上时:

     

o该程序必须询问用户(a)书的id,(b)书的作者,以及(c)书的标题。

     

o创建一个新的Book对象。

     

o通过调用相应的方法将其添加到BookShelf对象中。

这是我到目前为止在主java上所做的。

public class BookShelfApp {
public static void main(String[] args) {
    Scanner sc = new Scanner (System.in);

    ArrayList <Book> myList = new ArrayList<Book>();
    BookShelf myBookshelf = new BookShelf(myList);


    System.out.println("Enter ID of the book: ");
    int id = sc.nextInt(); sc.nextLine();

    System.out.println("Enter the author of the book: ");
    String author = sc.nextLine();

    System.out.println("Enter title of the book: ");
    String title = sc.nextLine();

    Book myBook = new Book(); //there is an error

}

我是java的新手,所以我不太擅长它。任何帮助将不胜感激!

4 个答案:

答案 0 :(得分:0)

我没有看到您的Book对象,但我希望您用以下内容定义:

  1. 一组代表作者,标题等的字段。
  2. a constructor taking those parameters
  3. e.g。

    public class Book {
       private String author;
       public Book(String author) {
          this.author = author;
       }
    }
    

    这样你就可以打电话了

    Book b = new Book("Jeffrey Archer");
    

    请注意,如果您只定义了带参数的构造函数,则不能然后使用默认构造函数(如上所述),而不明确定义它。您可以使用的唯一构造函数是您声明的构造函数。

    (注意:我看到你有构造者接受这些字段,也有建立者。我更喜欢前者而不是后者。通过提供setter,你可以使Book 变成 ,我不希望书的作者改变。通过提供一个no-args或默认构造函数,你可以创建一个没有作者的Book,这看起来也很奇怪)

答案 1 :(得分:0)

尝试使用和不使用以下字段创建constructor

 public class Book {

  private String author;
  //constructor without fields
  public Book() {}

   //constructor with fields
  public Book(String author) {
  this.author=author;
  }

  }

答案 2 :(得分:0)

不使用书籍的ArrayList而是使用List,以便您可以将所有书籍实例保存在一个列表中,然后创建一个构造函数方法,该方法设置表示id,作者和书名的字段,并将新的bookobjectlist添加到Bookshef中: / p>

示例:

List <Book> mylist = new List<Book>();

construcor

public class Book{
   private int id;
   private String author;
   private String title;


      public Book(int ID ,Strind Author,String Title)
        {
           this.id =ID;
           this.author= Author;
           this.title =Title;
          }

  }

收集ID,作者和标题的用户输入后,您可以使用setter方法或构造函数添加booh属性

例如

   System.out.println("Enter ID of the book: ");
   int id = sc.nextInt(); sc.nextLine();
   System.out.println("Enter the author of the book: ");
   String author = sc.nextLine();

   System.out.println("Enter title of the book: ");
   String title = sc.nextLine();

Book myBook = new Book(id,author,title)

然后将图书添加到您的图书清单中  例如:         mylist.add(mybook);

然后,将书添加到书架:BookShelf myBookshelf = new BookShelf(myList);

答案 3 :(得分:0)

更新。好点,Brian Agnew

Book类的最小传统实现看起来像这样。

package tests;

public class Book {
    private final int id;
    private final String author;
    private final String title;

    public Book(int id, String author, String title) {
        this.id = id;
        this.author = author;
        this.title = title;
    }

    public int getId() {
        return id;
    }

    public String getAuthor() {
        return author;
    }

    public String getTitle() {
        return title;
    }
}

BookShelf的最小实现如下所示:

package tests;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

public class BookShelf {

    private final ArrayList<Book> books = new ArrayList<Book>();

    public void addBook(Book book){
        books.add(book);
    }

    public List<Book> returnListOfBooks(){
        return books.stream()
                    .sorted(
                            (book1, book2)->{
                                return book1.getTitle().compareTo(book2.getAuthor());
                            })
                    .collect(Collectors.toList());
    }


    public List<Book> returnListOfBooksByAuthor(String author){
        return books.stream()
                    .filter(book->{
                                return author.equals(book.getAuthor());
                            })
                    .collect(Collectors.toList());
    }
}

返回使用Java 8流和lambdas,你肯定可以使用你想要的任何其他排序/过滤方法。

现在BookShelfApp类:

package tests;

import java.util.Scanner;

public class BookShelfAll {

    public static void main(String[] args) {
        Scanner sc = new Scanner (System.in);

        // I've removed the parameter here, as we do not need to know internal implementation of BookShelf 
        // from BookShelfAll
        BookShelf myBookshelf = new BookShelf();


        System.out.println("Enter ID of the book: ");
        int id = sc.nextInt(); sc.nextLine();

        System.out.println("Enter the author of the book: ");
        String author = sc.nextLine();

        System.out.println("Enter title of the book: ");
        String title = sc.nextLine();

        Book myBook = new Book(id, author, title); 

        //Now adding book to the bookshelf
        myBookshelf.addBook(myBook);

        //Now let's output all books in the bookshelf
        for(Book book: myBookshelf.returnListOfBooks()){
            System.out.println(book.getId() + " " + book.getTitle() + " by " + book.getAuthor());
        }
    }

}

编辑: 使用集合排序:

Collections.sort(books, (book1, book2)->{
        return book1.getTitle().compareTo(book2.getAuthor());
    });
    return books;

请注意,这将改变并返回BookShelf的内部列表,这并不总是好主意。您可能最好复制列表并排序/返回它。