我在练习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的新手,所以我不太擅长它。任何帮助将不胜感激!
答案 0 :(得分:0)
我没有看到您的Book对象,但我希望您用以下内容定义:
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的内部列表,这并不总是好主意。您可能最好复制列表并排序/返回它。