使用流 API 查找列表中项目的所有索引

Posted

技术标签:

【中文标题】使用流 API 查找列表中项目的所有索引【英文标题】:Find all the indexes of an item within a list using stream API 【发布时间】:2014-11-28 12:21:53 【问题描述】:

我正在尝试使用 Java 8 流和 lambda 表达式进行顺序搜索。这是我的代码

List<Integer> list = Arrays.asList(10, 6, 16, 46, 5, 16, 7);
int search = 16;
list.stream().filter(p -> p == search).forEachOrdered(e -> System.out.println(list.indexOf(e)));
Output: 2
        2

我知道list.indexOf(e) 总是打印第一次出现的索引。如何打印所有索引?

【问题讨论】:

我不认为你可以用这种结构做到这一点。过滤后,您就丢失了索引信息。如果您在此之后确实打印了索引,您将在过滤列表中获得索引。 ***.com/q/18552005/1407656 或 ***.com/q/22793006/1407656 的可能重复 @Tom 给定帖子中的查询是什么。当我尝试这个在查询时给出编译错误。 【参考方案1】:

首先,使用 Lambdas 并不是所有问题的解决方案......但是,即使这样,作为一个 for 循环,您也可以编写它:

List<Integer> results = new ArrayList<>();
for (int i = 0; i < list.size(); i++) 
    if (search == list.get(i).intValue()) 
        // found value at index i
        results.add(i);
    

现在,这并没有什么特别的问题,但请注意这里的关键方面是索引,而不是值。索引是“循环”的输入和输出。

作为流::

List<Integer> list = Arrays.asList(10, 6, 16, 46, 5, 16, 7);
int search = 16;
int[] indices = IntStream.range(0, list.size())
                .filter(i -> list.get(i) == search)
                .toArray();
System.out.printf("Found %d at indices %s%n", search, Arrays.toString(indices));

产生输出:

Found 16 at indices [2, 5]

【讨论】:

printf 函数末尾是否有额外的 %n,提供了三个替代但提供了两个参数? @Whome - %n 添加了一个操作系统特定的行终止符(一个行为良好的\n)。它不需要匹配的替换值。 (见“行分隔符in the documentation)【参考方案2】:

要找到List每个 值的索引作为Map,我们可以将IntStream 的索引与Collectors.groupingBy 一起使用。

import java.util.stream.Collectors;
import java.util.stream.IntStream;
//...
final Map<Integer, List<Integer>> indexMap = IntStream.range(0, list.size()).boxed()
        .collect(Collectors.groupingBy(list::get));
//16=[2, 5], 5=[4], 6=[1], 7=[6], 10=[0], 46=[3]
//Map of item value to List of indices at which it occurs in the original List

Demo

现在,如果您想获取search 的索引列表,您可以按如下方式进行:

System.out.println(indexMap.get(search));

【讨论】:

以上是关于使用流 API 查找列表中项目的所有索引的主要内容,如果未能解决你的问题,请参考以下文章

根据列表中项目内的部分字符串查找列表中的所有索引位置

Python 列表查找,如何在列表中查找项目或者元素索引翻译

在列表列表中查找项目的索引

如何在列表中查找项目的索引,在 Python 中使用正则表达式搜索项目?

F# list 查找项目索引

查找列表中第 n 个项目的索引