【问题标题】:How to add objects to an Array list by alphabetical order of particular variable of object如何按对象特定变量的字母顺序将对象添加到数组列表
【发布时间】:2018-12-28 03:33:59
【问题描述】:

我有一个图书馆程序,该程序中有一个 BorrowBookRecord Record 类和一个 Library 类。在 library 类中包含一个 'borrowBook()' 方法,当调用并成功使用该方法时,会创建一个 BorrowBookRecord 对象并将其添加到存储在 Library 类中的 BorrowBookRecords 数组列表中。我唯一的问题是我完全不知道如何让 borrowBook() 方法按字母顺序存储记录。我什至不知道从哪里开始。每条记录都有一个“学生用户名”作为其变量之一,我想用它来确定列表中对象的字母顺序。

这是图书馆类中的借书方法

 public boolean borrowBook(String librarianUsername, String studentUsername, String bookISBN){
    User user = findUserByUsername(studentUsername);

    if(checkPermissionTypeByUserNameBorrow(librarianUsername) && user.isOverBorrow() && checkPermissionTypeByUserNameReserve(studentUsername)){
        if(checkIfAnyAvaliable(bookISBN)){
              for(Book book: books){
                    if(book.getISBNNumber().equals(bookISBN) && book.checkAvaliable()){
                        book.modifyStatus(BookStatus.Reserved);
                        Date date = new Date();

                        BorrowBookRecord record = new BorrowBookRecord(studentUsername, bookISBN, book.getCopyNumber(), date);
                        borrowRecords.add(record);
     /////>>>this is where record is made.
                        user.increaseNumberOfborrowedBooks();
                        break;
                    }
              }                                   
        }
        else{
            throw new IllegalArgumentException("There are no books of that isbn avaliable to borrow");
            }
    }
    else{
        throw new IllegalArgumentException("Student cannot borrow anymore Books/librarian has wrong permissontype");
    }
    return true;
}

【问题讨论】:

    标签: java sorting arraylist


    【解决方案1】:

    你可以用自定义比较器做一个binary search来找到插入点,只要你保持顺序:

    int index = Collections.binarySearch(borrowRecords, record,
            Comparator.comparing(BorrowBookRecord::getStudentUsername));
    if (index < 0) {
        index = -(index + 1);
    }
    borrowRecords.add(index, record);
    

    或者您可以让BorrowBookRecord 实现Comparable 而不是使用比较器。

    【讨论】:

    • 工作就像一个魅力
    • 底层数据结构 - Array 必须将所有后续元素向右移动。 LinkedList 不会有效地做到这一点吗?
    • @shriyog 理论上可能。实际上,ArrayList 几乎总是更有效[需要引用]。而且 LinkedList 会减慢二分查找,需要插入前遍历。
    • @shmosel 感谢您的澄清。我同意这一点。
    【解决方案2】:

    如果元素必须根据某些标准以排序方式存储,则必须使用TreeSet 而不是ArrayList

    您可以替换您的数据结构以使用Java TreeSet,以便在每次插入后您都可以根据给定的标准对元素进行排序。

    元素使用它们的自然顺序进行排序,或者通过 在设置创建时间提供比较器,具体取决于哪个 使用构造函数。

    在这里,您需要根据您的订购要求提供Comparator。因此,要根据studentUsername 订购,您必须将 Comparator 定义为 -

    public class BookComparator implements Comparator<BorrowBookRecord > {
        @Override
        public int compare(BorrowBookRecord o1, BorrowBookRecord o2) {
            return o1.studentUsername.compareTo(o2.studentUsername);
        }    
    }
    

    【讨论】:

    • 除非 BorrowBookRecord 实现 Comparable,否则这是行不通的。
    • @tgdavies 正确。或者我可以在初始化TreeSet 时传递Comparator
    • 使用集合而不是列表会限制 BorrowBookRecord 项目是唯一的。
    • @JonathanRosenne 没错。如果我们想允许重复,TreeMultiset 是一个选项。你怎么看?
    猜你喜欢
    • 1970-01-01
    • 2017-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-11
    相关资源
    最近更新 更多