按字母顺序对书名进行排序(没有Comparable或Comparator接口)

时间:2016-01-09 15:06:46

标签: java sorting arraylist

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

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

  

id(int),作者和标题

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

  

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

     

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

     

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

我的问题是,如何创建方法 returnListOfBooks 并按字母顺序按标题对它们进行排序?

**我必须实现排序,不允许使用Java的排序机制。 ** 有没有办法可以使用for循环???

来使用这种排序

我还必须执行以下操作,并在主驱动程序中按字母顺序排序:

  

•调用方法以从BookShelf对象返回作者的书籍列表。

     

•遍历书籍列表并逐一打印。

     

•独特书籍数量。

我该怎么做?

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

2 个答案:

答案 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);
  }
}