Java 8/9:字符串中的字符可以映射到其索引(使用流)吗?

2022-09-02 11:51:43

给定 a 和 a,我很好奇是否存在某种生成 a from 的方法(其中的元素表示 in 的索引)。String schar cList<Integer> listslistcs

一个接近但不正确的方法是:

public static List<Integer> getIndexList(String s, char c) {
    return s.chars()
            .mapToObj(i -> (char) i)
            .filter(ch -> ch == c)
            .map(s::indexOf) // Will obviously return the first index every time.
            .collect(Collectors.toList());
}

以下输入应生成以下输出:

getIndexList("Hello world!", 'l') -> [2, 3, 9]

答案 1

可以使用 IntStream 完成

public static List<Integer> getIndexList(String s, char c) {
    return IntStream.range(0, s.length())
                    .filter(index -> s.charAt(index) == c)
                    .boxed()
                    .collect(Collectors.toList());
}

答案 2

使用 Java 9,您可以使用最后一个索引作为起点进行迭代搜索,并在找不到匹配项时停止:

public static List<Integer> getIndexList(String s, char c) {
    return IntStream.iterate(s.indexOf(c), i -> s.indexOf(c, i + 1))
            .takeWhile(i -> i > -1)
            .boxed()
            .collect(Collectors.toList());
}

免责声明:我没有测试这个。