Java8/9:可以将字符串中的字符映射到它的索引(使用流)吗?
Java 8/9: Can a character in a String be mapped to its indices (using streams)?
给定一个 String s
和一个 char c
,我很好奇是否存在从 s
生成 List<Integer> list
的某种方法(其中 list
代表c
在s
)的索引。
接近但不正确的方法是:
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]
可以用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());
}
使用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());
}
免责声明:我没有对此进行测试。
Java9 中的替代方法是使用 iterate(int seed, IntPredicate hasNext,IntUnaryOperator next)
如下:-
private static List<Integer> getIndexList(String word, char c) {
return IntStream
.iterate(word.indexOf(c), index -> index >= 0, index -> word.indexOf(c, index + 1))
.boxed()
.collect(Collectors.toList());
}
...或在 java-9:
Stream.of("Hello world!")
.map(Scanner::new)
.flatMap(s -> s.findAll("l"))
.map(mr -> mr.start())
.forEach(System.out::println);
给定一个 String s
和一个 char c
,我很好奇是否存在从 s
生成 List<Integer> list
的某种方法(其中 list
代表c
在s
)的索引。
接近但不正确的方法是:
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]
可以用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());
}
使用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());
}
免责声明:我没有对此进行测试。
Java9 中的替代方法是使用 iterate(int seed, IntPredicate hasNext,IntUnaryOperator next)
如下:-
private static List<Integer> getIndexList(String word, char c) {
return IntStream
.iterate(word.indexOf(c), index -> index >= 0, index -> word.indexOf(c, index + 1))
.boxed()
.collect(Collectors.toList());
}
...或在 java-9:
Stream.of("Hello world!")
.map(Scanner::new)
.flatMap(s -> s.findAll("l"))
.map(mr -> mr.start())
.forEach(System.out::println);