将流中的行拆分为单词以映射其长度和值

  • 本文关键字:映射 单词 拆分 java java-8
  • 更新时间 :
  • 英文 :


从给定的文本中,通过使用流操作,我需要创建一个 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));

最新更新