如何按字母顺序排序(没有Comparable或Comparator接口)

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

我有一本课程 ,其中包含以下信息:

id(int),作者和标题

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

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

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

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

我的问题是,如何创建方法returnListOfBooks并按字母顺序按标题对它们进行排序? 如果你能检查我的方法并纠正我,如果我正在做的事情是错误的,那也很好。

我必须实现排序 (冒泡排序,插入排序等)

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

在Java中,您通常使用Collections.sortList进行排序,如果需要,还可以使用自定义比较器。 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)); 

这次将根据author对相同的listOfBooks进行排序

您需要让Book类实现Comparable接口,然后比较书籍的名称。

现在,Java Framework已经提供了一种排序机制,可以通过Collections.sort对列表进行排序。 如果您实现上面的接口,您应该能够简单地调用Collections.sort(listOfBooks)并对您的集合进行排序。

或者,如果您需要实现自己的排序机制,则可以这样做,然后使用Comparable接口为您提供的.compareTo方法比较书籍。

虽然您确实需要使Book对象彼此可比,但您可能在当前代码中看到的另一个错误是并发修改exception,因为您在迭代时对列表进行排序。

所以你的方法应该是这样的,因为要求是返回一个排序列表,而不是打印它。

注意,如果要在调用此方法之前和之后保持listOfBooks的初始顺序,则需要将整个列表复制到另一个列表中,然后将其排序并返回。

 public ArrayList returnListOfBooks() { Collections.sort(listOfBooks); // could print them, also, if you wish return listOfBooks; } 

书类

 import java.util.Comparator; 

import java.util.Objects;

public class Book implements Comparable {

 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 bookList = new ArrayList(); public void addBook(Book book) { bookList.add(book); } public ArrayList bookList(String sortBy) { ArrayList list = new ArrayList(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 {} class AutherComparator implements SortingComparator { @Override public int compare(Book b1, Book b2) { return (b1.getAutherName().toUpperCase()).compareTo((b2.getAutherName().toUpperCase())); } 

}

 class BookNameComparator implements Comparator,SortingComparator { @Override public int compare(Book b1, Book b2) { return (b1.getBookName().toUpperCase()).compareTo((b2.getBookName().toUpperCase())); }} 

主CLass

 public static void main(String s[]) { BookShelf bookShelf = new BookShelf(); bookShelf.addBook(new Book("Algorithm", "Toman", "12-34")); bookShelf.addBook(new Book("DataBase", "Sethi", "12-35")); bookShelf.addBook(new Book("DataStruture", "Ulman", "12-36")); bookShelf.addBook(new Book("Network", "Tanenbom", "12-37")); ArrayList list = bookShelf.bookList("auther"); System.out.println("----Sort by Auther-----------"); for (Book b : list) { System.out.println(b); } System.out.println("----Sort by Book Name-----------"); list = bookShelf.bookList("bookname"); for (Book b : list) { System.out.println(b); } }