Java 仅当ArrayList B中的某个对象的组件不';不存在
我有两个目标:书籍和图书贷款。所有书籍都存储在一个名为books和Bookloans on loans的ArrayList中 BookLoans的一个组成部分是bookId。如果BookLoans列表中不存在bookId,我希望将所有书籍添加到组合框中。两个列表的大小不同 我正在使用MVC,组合框的视图端正在工作 我认为它将由两个for循环组成,因此这是我当前的尝试:Java 仅当ArrayList B中的某个对象的组件不';不存在,java,arrays,arraylist,Java,Arrays,Arraylist,我有两个目标:书籍和图书贷款。所有书籍都存储在一个名为books和Bookloans on loans的ArrayList中 BookLoans的一个组成部分是bookId。如果BookLoans列表中不存在bookId,我希望将所有书籍添加到组合框中。两个列表的大小不同 我正在使用MVC,组合框的视图端正在工作 我认为它将由两个for循环组成,因此这是我当前的尝试: int length = books.size(); int loansLength = loans.size(); St
int length = books.size();
int loansLength = loans.size();
String[] listBooksCombo = new String[length];
for (int i = 0; i < loansLength; i++){
for(int j = 0; j < length; j++){
title = books.get(j).getTitle(); // Currently for testing purposes the getTitle and getBookId both are titles of a book
if(loans.get(i).getBookId() != title ){
listBooksCombo[j] = title;
}
currentView.comboBox(listBooksCombo); // sets the combo model
}
}
int length=books.size();
int loansLength=loans.size();
String[]listBooksCombo=新字符串[长度];
for(int i=0;i
目前,我得到的唯一结果是,当两个数组列表中都有对象时,组合框中不会出现任何内容。以下是我的操作方法。解释在评论中
// collect the IDs of the book loans in a set - this makes lookup faster
Set<String> loanedBookIds = HashSet<>();
for (BookLoan loan : bookLoans) {
loanedBookIds.add(loan.getBookId());
}
// put the names of unloaned books here
List<String> unloanedTitles = new ArrayList<>();
for (Book book : books) {
// add all books whose IDs are not in `loanedBookIds`
if (!loanedBookIds.contains(book.getId())) {
unloanedTitles.add(book.getTitle());
}
}
// show titles in the ComboBox
currentView.comboBox(unloanedTitles);
//在一个集合中收集图书借阅的ID-这使查找更快
Set loanedBookIds=HashSet();
用于(账面贷款:账面贷款){
loanedBookIds.add(loan.getBookId());
}
//把未装好的书的名字放在这里
List unloanedTitles=new ArrayList();
用于(书籍:书籍){
//添加ID不在“LoanedBookID”中的所有书籍`
如果(!loanedBookIds.contains(book.getId())){
unloanedTitles.add(book.getTitle());
}
}
//在组合框中显示标题
currentView.comboBox(未加载的标题);
正如JB Nizet所指出的,您应该将检查借书的部分分离到一个单独的方法中,以使代码更简单、更清晰(然后您可以编写类似于
books.stream().filter(book->!hasBeenLoaned(book)).map(book->book.getTitle()的内容)
。我选择在这里不这样做仅仅是为了简洁。你需要将作品分成更小的部分,以避免这样的逻辑错误。逻辑应该是(每本书中的每一本){if(existsInBookLoans(book){addBookToCombo(book)}
。现在,您可以在方法existsInBookLoans
中实现一个更简单的算法。您无法预先知道组合的长度,因此请使用列表,而不是数组。