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

时间:2015-12-31 12:17:57

标签: java sorting arraylist

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

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

  

id(int),作者和标题

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

  

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

     

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

     

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

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

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

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

4 个答案:

答案 0 :(得分:4)

在Java中,您通常会使用ListCollections.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()));
}}