从给定的文本中,通过使用流操作,我需要创建一个 Map,其中单词长度是一个键,单词列表是一个值。我需要过滤掉不超过 4 个字符的单词。
String text = "random.txt";
Stream<String> lines = Files.lines(Paths.get(text))
Map<Integer,List<String>> map = lines.map(line -> line.split("[\s]+"))
.filter(word -> word.length > 4)
.collect(Collectors.groupingBy(
word -> Integer.valueOf(word[0].length()),
Collectors.mapping(word -> word[0], Collectors.toList()))
);
我一定是理解错了什么,我使用过滤器的方式不起作用 - 抛出索引出界异常。我应该如何排除长度少于 4 个字符的单词?
我只能弄清楚如何映射每行的第一个单词。我应该将什么更改为地图 每一句话? 谢谢!
代码后的注释。
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class Tester {
private static Map<Integer, List<String>> byLines(String filePath) throws IOException {
Path path = Paths.get(filePath);
try (Stream<String> lines = Files.lines(path)) {
return lines.flatMap(line -> Arrays.stream(line.split("\s+")))
.filter(word -> word.length() > 4)
.collect(Collectors.groupingBy(word -> word.length()));
}
}
public static void main(String[] args) {
try {
Map<Integer, List<String>> map = byLines("random.txt");
map.forEach((key, value) -> System.out.printf("%d: %s%n", key, value));
}
catch (IOException xIo) {
xIo.printStackTrace();
}
}
}
您需要调用方法flatMap
来创建一个连接每行所有单词的Stream
,从而将Stream
行文本转换为单词流。
split
(类String
)返回一个数组.方法stream
(类Arrays
) 从数组创建一个Stream
.
MethodflatMap
连接所有行中的所有单词,并创建一个包含文件random.txt.
Stream=" />然后保留所有包含超过 4 个字符的单词.
然后根据自己的要求收集单词, 即一个Map
,其中 [map] 键是长度,[map] 值是包含具有相同长度的所有单词的List
。
Map<Integer, List<String>> map = Stream.of("hello", "hell", "gun", "chicken", "building", "process", "world")
.filter(pred -> pred.length() > 4)
.collect(Collectors.groupingBy(String::length));