Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 仅当ArrayList B中的某个对象的组件不';不存在_Java_Arrays_Arraylist - Fatal编程技术网

Java 仅当ArrayList B中的某个对象的组件不';不存在

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

我有两个目标:书籍和图书贷款。所有书籍都存储在一个名为books和Bookloans on loans的ArrayList中

BookLoans的一个组成部分是bookId。如果BookLoans列表中不存在bookId,我希望将所有书籍添加到组合框中。两个列表的大小不同

我正在使用MVC,组合框的视图端正在工作

我认为它将由两个for循环组成,因此这是我当前的尝试:

 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
中实现一个更简单的算法。您无法预先知道组合的长度,因此请使用列表,而不是数组。