当前位置: 首页 > 知识库问答 >
问题:

如何在lambda流中查找搜索条件中的最后一个对象并将其移除

卢永寿
2023-03-14

我有一张书单。其中一些书是相同的,但它们不是重复的,因为它们的不同是因为一个名为CopyNumber的变量。例子。<代码>第1册(标题:蜘蛛侠,ISBN:1111,版权编号:1) ,<代码>第2册(标题:蜘蛛侠,ISBN:1111,版权编号:2) ,<代码>第3册(标题:蜘蛛侠,ISBN:1111,版权编号:3) ,<代码>第4册(标题:爱丽丝梦游仙境,ISBN:2222,版权编号:1) ,<代码>第5册(标题:爱丽丝梦游仙境,ISBN:2222,版权编号:2) 。所以我的目标是把所有这些书按拷贝号顺序列出,通过ISBN号找到这本书(和它的拷贝),然后删除最后一个拷贝。因此,对于上面的示例,如果调用deletebook(“1111”);,我将删除Spiderman的第三个副本。如果调用deletebook(“2222”);,我会删除爱丽丝梦游仙境的第二个副本

public void deleteBook(String isbn){
    Collections.sort(books, new OrderBooksByCopyNumber());
    Book book = books.stream().filter((b) -> (b.getISBNNumber().equals(isbn))).findFirst().get();
    books.remove(book);

 }

上面的代码很接近我想要的,我不想要findfirst(),我想要执行findlast()等价的操作。下面是我的比较,如果它有任何相关性。感谢任何能帮忙的人!

private class OrderBooksByCopyNumber implements Comparator<Book>{

    @Override
    public int compare(Book o1, Book o2) {
        return o1.getCopyNumber() <  o2.getCopyNumber() ? -1 : o1.getCopyNumber() == o2.getCopyNumber() ? 0 : 1;
    }

}

共有1个答案

松成和
2023-03-14

您的代码有几个问题。

首先,当您只想比较拷贝数时,没有理由编写自己的比较器。您编写的比较器等效于comparator.comparingInt(Book::GetCopyNumber)

其次,如果您使用的是可选get方法,那么您可能做错了什么。在本例中,您不考虑可选为空的情况--没有任何书籍与给定的ISDN匹配。相反,你应该做一些类似的事情

...findFirst().ifPresent( book -> books.remove(book) );
public void deleteBook(String isbn){
    books.stream()
         .filter((b) -> (b.getISBNNumber().equals(isbn)))
         .max(Comparator.comparingInt(Book::getCopyNumber))
         .ifPresent(book->books.remove(book));
}
int maxCopyNumber = -1;
int bookIndex = -1;

ListIterator iter = books.listIterator();
while ( iter.hasNext() ) {
   Book book = iter.next();
   if ( book.getISBNNumber().equals(isbn) && book.getCopyNumber() > maxCopyNumber ) {
       maxCopyNumber = book.getCopyNumber();
       bookIndex = iter.previousIndex();
   }
}
if ( bookIndex >= 0 ) {
   books.remove(bookIndex);
}

如果您的列表是ArrayList或类似的列表,这将防止遍历它两次,因为删除是在O(1)中执行的。

最后,考虑完全使用不同的数据结构!例如,映射 list > ,其中键是ISDN,每个条目是图书列表,按拷贝数排序。这将允许您直接到达列表,只需移除最后一个元素。(如果列表为空,则完全删除该条目,或者从一开始就检查它不是空的)。

 类似资料:
  • 问题内容: 我有绳子。我想找到最后一个/来分割字符串。最初的尝试是:但这很明显。有人给小费吗? 问题答案: 您是否需要为此使用正则表达式?将字符串。lastIndexOf(“ /”) 工作来查找索引,然后将String.substring(int start,int end) 与结果一起使用?还是您的实际数据不同且更加复杂,需要使用正则表达式?使用您提供的在最后一个/处分割字符串的代码,这里是代码

  • 我正在使用Nest连接到ElasticSearch并执行一些查询。到目前为止,在给定一个通配符查询的情况下,我能够得到我想要的结果,如下所示: 但是现在我需要为某个用例的查询添加附加条件。 我需要的不仅是通过查询,还需要其他两个匹配的字段: 搜索术语"*" field 1="一些字符串" field="一些指南" 我确信在弹性搜索中一定有办法做到这一点(使用Nest),但我还没有找到它。 我知道我

  • 问题内容: 我在MongoDB上的Java查询中遇到了一些麻烦。 我在数据库中具有以下结构: 我想在数据库中查询字段’Sta​​tus.name’,例如SELECT * FROM table WHERE status.name =’Expired’ 我将如何在Java中为MongoDB进行这样的查询? 感谢您的帮助或建议! 问题答案: 这是一个例子:

  • 我正在使用一个输入文件用不同的字符串填充我的数组。如何检查数组的填充位置?我将数组的大小初始化为30000,但如何检查它包含的字符串的索引? 谢谢你的帮助!

  • 我有一个对象数组,当我使用indexOf时,我想在其中找到所选对象的索引,我得到的值为-1,任何人都可以告诉我如何在javascript中找到对象的indexOf

  • 我试图创建一个java程序,它可以读取一个名为file1.txt的文件,存储它的字符串,并将这些字符串搜索到另一个名为file2.txt的文件,如果没有找到匹配,则从file1.txt打印特定的字符串。 现在我可以从file1.txt获得数据,但无法搜索file1的数据,例如在file2.txt中搜索单词“home” 请看这里的file1.txt包含Homee,而file2.txt有Home,所以