我在练习Java时遇到了一个问题。
我有一个 Book 类,它存储以下信息:
id(int),作者和标题
我有另一个类 BookShelf ,它使用Vector / ArrayList存储一系列书籍,并具有以下方法:
addBook:将一个book对象作为输入,将该对象添加到bookshelf中,方法不返回任何内容。
returnListOfBooks:不接受任何参数,并按字母顺序返回按标题排序的所有图书的Vector / ArrayList。
returnListOfBooksByAuthor:将作者作为输入并返回该作者的书籍的Vector / ArrayList
我的问题是,如何创建方法 returnListOfBooks 并按字母顺序按标题对它们进行排序?如果你能检查我的方法并纠正我,如果我正在做的事情是错误的,那也很好。
我必须实施排序(冒泡排序,插入排序等)
我是java的新手,所以我不太擅长它。任何帮助将不胜感激!
答案 0 :(得分:4)
在Java中,您通常会使用List
对Collections.sort
进行排序,如果需要,还可以使用自定义比较器。 Java 8允许使用简洁的语法。
// easy to change for descending order
Collections.sort(listOfBooks, (a, b) -> a.getTitle().compareTo(b.getTitle()));
甚至更好
Collections.sort(listOfBooks, Comparator.comparing(Book::getTitle));
请注意,两者都会对listOfBooks
进行排序(而不是返回新的排序列表)。每次拨打returnListOfBooks
时,您可能都不希望这样做。如果是例如你在returnListOfBooksByAuthor
内做
Collections.sort(listOfBooks, Comparator.comparing(Book::getAuthor));
同一listOfBooks
将根据此次author
答案 1 :(得分:0)
您需要让Book
班级实施Comparable
界面,然后比较图书的名称。
现在,Java Framework已经提供了一种排序机制,可以通过Collections.sort对列表进行排序。如果您实现上面的界面,您应该只需调用Collections.sort(listOfBooks)
并对您的收藏进行排序。
或者,如果您需要实现自己的排序机制,只需执行此操作,然后使用.compareTo
界面为您提供的Comparable
方法比较书籍。
答案 2 :(得分:0)
虽然您确实需要使Book对象彼此可比,但您可能在当前代码中看到的另一个错误是并发修改异常,因为您在迭代时对列表进行排序。
所以你的方法应该是这样的,因为要求是返回一个排序列表,而不是打印它。
注意,如果要在调用此方法之前和之后保持listOfBooks的初始排序,则需要将整个列表复制到另一个列表中,然后将其排序并返回。
git branch -r
答案 3 :(得分:-1)
书类
removeClass
import java.util.Objects;
公共类Book实现了Comparable {
import java.util.Comparator;
书架
private String bookName;
private String autherName;
private String isbn;
public Book(String bookName, String autherName, String isbn) {
this.bookName = bookName;
this.autherName = autherName;
this.isbn = isbn;
}
public String getBookName() {
return bookName;
}
public void setBookName(String bookName) {
this.bookName = bookName;
}
public String getAutherName() {
return autherName;
}
public void setAutherName(String autherName) {
this.autherName = autherName;
}
public String getIsbn() {
return isbn;
}
public void setIsbn(String isbn) {
this.isbn = isbn;
}
@Override
public int compareTo(Book book) {
return this.bookName.compareTo(book.bookName);
}
@Override
public int hashCode() {
int hash = 7;
hash = 53 * hash + Objects.hashCode(this.bookName);
return hash;
}
@Override
public String toString(){
return bookName +" "+autherName + " "+isbn;
}}
比较
public class BookShelf {
private ArrayList<Book> bookList = new ArrayList<Book>();
public void addBook(Book book) {
bookList.add(book);
}
public ArrayList<Book> bookList(String sortBy) {
ArrayList<Book> list = new ArrayList<Book>(bookList);
SortingComparator comparator = null;
if (sortBy.equals("auther")) {
comparator = new AutherComparator();
} else if (sortBy.equals("bookname")) {
comparator = new BookNameComparator();
}
Collections.sort(list, comparator);
return list;
}}
}
interface SortingComparator extends Comparator<Book> {}
class AutherComparator implements SortingComparator {
@Override
public int compare(Book b1, Book b2) {
return (b1.getAutherName().toUpperCase()).compareTo((b2.getAutherName().toUpperCase()));
}
主要CLass
class BookNameComparator implements Comparator<Book>,SortingComparator {
@Override
public int compare(Book b1, Book b2) {
return (b1.getBookName().toUpperCase()).compareTo((b2.getBookName().toUpperCase()));
}}