【问题标题】:How to sort by alphabetical order (without Comparable or Comparator interfaces)如何按字母顺序排序(没有 Comparable 或 Comparator 接口)
【发布时间】:2016-04-05 10:14:27
【问题描述】:

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

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

id (int)、作者和标题

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

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

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

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

我的问题是,如何创建方法 returnListOfBooks 并按标题按字母顺序对它们进行排序?如果您可以检查我的方法并在我做错了时纠正我,那也很棒。

我要实现排序(冒泡排序、插入排序等)

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

【问题讨论】:

  • 是否需要实现排序算法?是否允许使用 Java 的排序机制(Comparator 和 Comparable 接口)?
  • 旁注:returnListOfBooksByAuthor 不应返回 null 或在找到第一个匹配作者后立即返回。
  • @ThiagoPorciúncula 是的,我必须实现排序算法,并且不允许使用 Java 的排序机制。
  • @Minchae 您应该将其添加到您的问题中。现在你有四个答案都不能解决你的问题。

标签: java sorting arraylist


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

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

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

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

      【讨论】:

        【解决方案4】:

        图书课

        import java.util.Comparator;
        

        导入 java.util.Objects;

        公共类 Book 实现 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<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 BookNameComparator implements Comparator<Book>,SortingComparator {
        @Override
        public int compare(Book b1, Book b2) {
            return (b1.getBookName().toUpperCase()).compareTo((b2.getBookName().toUpperCase()));
        }}
        

        主类

        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<Book> 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);
            }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-08-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-02-10
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多