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

在列表中查找元素的Java8流

彭俊智
2023-03-14

我有以下几门课:

public class Item {
    int id;
    String name;
    // few other fields, contructor, getters and setters
}

我有一个物品清单。我想遍历列表并找到具有特定ID的实例。我试着通过溪流来做。

public void foobar() {

    List<Item> items = getItemList();
    List<Integer> ids = getIdsToLookup();
    int id, i = ids.size() - 1;

    while (i >= 0) {
        id = ids.get(i);
        Optional<Item> item = items
            .stream()
            .filter(a -> a.getId() == id)
            .findFirst();
        // do stuff
        i--;
    }
}

共有1个答案

刘阳荣
2023-03-14

如果要搜索很多ID,建议使用一次搜索的解决方案,而不是对每个ID进行线性搜索:

Map<Integer,Optional<Item>> map=ids.stream()
    .collect(Collectors.toMap(id -> id, id -> Optional.empty()));
items.forEach(item ->
    map.computeIfPresent(item.getId(), (i,o)->o.isPresent()? o: Optional.of(item)));
for(ListIterator<Integer> it=ids.listIterator(ids.size()); it.hasPrevious();) {
    map.get(it.previous()).ifPresent(item -> {
        // do stuff
    });
}

第一条语句只是从ids列表中创建一个映射,将每个搜索id映射到一个空的optional

第二个语句使用foreach迭代项,并且对于每个项,它检查是否存在从其id到空的optional的映射,如果存在这样的映射,它将用封装该项的optional替换,所有操作都是computeifpresent

最后一个for循环在ids列表上向后迭代,如果有非空的optional则按您希望的顺序处理它们,并执行该操作。由于映射是用列表中找到的所有id初始化的,get将永远不会返回null,如果在items列表中找不到id,它将返回一个空的option

这样,假设map的查找具有O(1)时间复杂度(这是典型实现中的情况),则净时间复杂度从O(m×n)变为O(m+n)

 类似资料:
  • 问题内容: 我有一个清单“ a” 我需要找到一个特定数字的所有元组。说1 我怎么做? 问题答案: 如果只希望第一个数字匹配,则可以这样操作: 如果您仅搜索其中包含1的元组:

  • 问题内容: 所以这是我的代码: 包含一个整数列表。我想比较于并打印出不在的数字相比时。 当不能比较时,我可以打印其中的元素,但是当我尝试使用上面的代码进行相反操作时,则什么也不会打印。 有什么帮助吗? 问题答案: 您的代码没有按照我认为的方式执行。该行将遍历,每次等于的一个元素。因此,在执行任何操作之前,原始列表将被覆盖。 我想你想要这样的东西: 但是您可以轻松地执行以下操作: 或(如果您不介意丢

  • 我试图列出整数列表中的重复元素,例如, 使用jdk 8的流。有人试过吗?要删除重复项,我们可以使用distinct() api。但是如何找到重复的元素呢?有人能帮我吗?

  • 主要内容:index() 方法,count()方法Python 列表(list)提供了 index() 和 count() 方法,它们都可以用来查找元素。 index() 方法 index() 方法用来查找某个元素在列表中出现的位置(也就是索引),如果该元素不存在,则会导致 ValueError 错误,所以在查找之前最好使用 count() 方法判断一下。 index() 的语法格式为: listname.index(obj, start, en

  • 问题内容: 在Python列表中查找最常见元素的有效方法是什么? 我的列表项可能无法散列,因此无法使用字典。同样在绘制的情况下,应返回索引最低的项目。例: 问题答案: 提出了这么多解决方案,令我惊讶的是没有人提出我认为显而易见的解决方案(对于不可哈希但可比较的元素)-。 提供快速,可重用的功能,并允许你将一些棘手的逻辑委托给经过良好测试的标准库组件。考虑例如: 当然,这可以写得更简洁一些,但我的目

  • 本文向大家介绍Python从列表中查找子列表元素的索引,包括了Python从列表中查找子列表元素的索引的使用技巧和注意事项,需要的朋友参考一下 在本教程中,我们将编写一个程序,该程序从列表中查找子列表元素的索引。让我们看一个例子来清楚地理解它。 输入列表 输出结果 让我们看看解决给定问题的最简单,最常见的方法。按照给定的步骤解决它。 初始化列表。 使用索引遍历列表。 遍历子列表并检查要查找索引的元