如何通过对象的特定变量的字母顺序将对象添加到数组列表

时间:2018-12-28 03:34:00

标签: java sorting arraylist

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

这是库类中的借书方法

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

2 个答案:

答案 0 :(得分:1)

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

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

  

使用自然顺序或通过   在设置创建时提供的比较器,具体取决于哪个   使用构造函数。

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

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

答案 1 :(得分: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而不是使用比较器。