我在练习Java时遇到了一个问题。
我有一个 Book 类,它存储以下信息:
id(int),作者和标题
我有另一个类 BookShelf ,它使用Vector / ArrayList存储一系列书籍,并具有以下方法:
addBook:将一个book对象作为输入,将该对象添加到bookshelf中,方法不返回任何内容。
returnListOfBooks:不接受任何参数,并按字母顺序返回按标题排序的所有图书的Vector / ArrayList。
returnListOfBooksByAuthor:将作者作为输入并返回该作者的书籍的Vector / ArrayList
我的问题是,如何创建方法 returnListOfBooks 并按字母顺序按标题对它们进行排序?
**我必须实现排序,不允许使用Java的排序机制。 **
有没有办法可以使用for
循环???
我还必须执行以下操作,并在主驱动程序中按字母顺序排序:
•调用方法以从BookShelf对象返回作者的书籍列表。
•遍历书籍列表并逐一打印。
•独特书籍数量。
我该怎么做?
我是java的新手,所以我不太擅长它。任何帮助将不胜感激!
答案 0 :(得分:0)
这个答案是在之前写的,标题改为"(没有Comparable或Comparator界面)" 。
您可以像这样实现比较器:
class TitleComparator implements Comparator<Book> {
@Override
public int compare(Book a, Book b) {
return a.title.compareToIgnoreCase(b.title);
}
}
然后你可以:
Collections.sort(books, new TitleComparator());
您的图书将根据title
按字典顺序排序。
答案 1 :(得分:0)
由于您不允许实施/使用
Comparable or Comparator
。
我建议如下:
private ArrayList<Book> sortedByTitleBooks;
private ArrayList<Book> sortedByAuthorBooks;
在内部维护另外两本书籍,这些书籍将按照有序的方式存放。为此实施insertion sort
。现在,每次addBook(Book)
将图书添加到listOfBooks
时,也会将同一本书添加到其他列表中。
现在,您可以直接从各自的方法返回已排序的图书清单。
您可以使用String类中的compareTo(String)
进行比较。
以下是使用author
名称对书籍进行排序的实现。
public void addBook(Book a){
listOfBooks.add(a);
sortByAuthor(a); // add the book into sortedByAuthor list as well
}
// insertion sorting
public void sortByAuthor(Book book) {
if (sortedByAuthorBooks.isEmpty()) {
sortedByAuthorBooks.add(book);
return;
}
int size = sortedByAuthorBooks.size()-1;
System.out.println(size);
int index = 0;
boolean inserted = false;
while(index <= size) {
Book b = sortedByAuthorBooks.get(index);
int result = b.getAuthor().compareTo(book.getAuthor());
if (result >= 0) {
System.out.println(result);
sortedByAuthorBooks.add(index, book);
inserted = true;
break;
}
index++;
}
if (!inserted) {
sortedByAuthorBooks.add(book);
}
}