【问题标题】:Sorting the name of book by alphabetical order (without Comparable or Comparator interfaces) [duplicate]按字母顺序对书名进行排序(没有 Comparable 或 Comparator 接口)[重复]
【发布时间】:2016-01-09 15:06:46
【问题描述】:

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

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

id (int)、作者和标题

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

addBook:接受一个书本对象作为输入,将该对象添加到书架中,该方法不返回任何内容。

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

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

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

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

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

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

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

• 独特书籍的数量。

我该怎么做?

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

【问题讨论】:

  • 您需要实现两个分隔符Comparator,以便按titleauthor 对书籍进行排序。
  • @YoungHobbit 我不允许使用Java的排序机制
  • 你在 9 天前问过同样的问题 -> 投票以重复关闭。
  • 这里有任何问题之前请先努力,如果是重复的,你应该自己做一些工作。

标签: java sorting arraylist


【解决方案1】:

这个答案写在之前标题更改为“(没有 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 的字典顺序进行排序。

【讨论】:

  • 我不允许使用Java的排序机制(包括Comparator
【解决方案2】:

因为你不能实现/使用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);
  }
}

【讨论】:

  • insertion sort 如何工作?我知道如何将insertion sort 仅用于整数而不是字符串...如果您能帮助我以最低限度的方式实现它,那就太好了。
  • 我已经为您提供了author 的实现,您可以为title 编写类似的实现。
猜你喜欢
  • 2016-04-05
  • 2016-08-25
  • 1970-01-01
  • 2018-01-27
  • 2021-04-23
  • 2013-04-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多