[英]How to split strings from streams using Java
我有一个巨大的.txt
文件,格式如下:
29 clueweb12-1500wb-39-00001
19 clueweb12-1500wb-39-00002
20 clueweb12-1500wb-39-00003
我需要逐行阅读该文件并将其分为两个部分。 第一部分的分数为(29,19,20)
,第二部分的分数为docIds( clueweb12-1500wb-39-00001
)。 我通过使用流逐行读取txt
文件,但是如何将这两部分放入String
呢?
Stream<String> lines = File.lines(Paths.get("path-to-file");
lines.forEach(s -> s.split(" "));
`
我相信Java流方式是:
Map<Integer, List<String>> parts = lines.map(s -> s.split(" "))
.collect(Collectors.groupingBy(splitLine -> Integer.valueOf(splitLine[0]),
Collectors.mapping(splitLine -> splitLine[1], Collectors.toList())));
这为您提供了以下地图:
{19=[clueweb12-1500wb-39-00002], 20=[clueweb12-1500wb-39-00003], 29=[clueweb12-1500wb-39-00001]}
它的toString
方法无法为您提供最易读的输出,但我相信它就是您所要求的地图。 目前,每个列表中只有一个字符串,但是如果多行具有相同的分数,那么将会更多。
将Collectors.groupingBy
与下游收集Collectors.groupingBy
一起使用,该收集器在收集到列表之前获取拆分行的第二部分。
Map<Integer, List<String> table =
Files.lines(Paths.get("path-to-file"))
.map(line -> line.split(" ", 2))
.collect(Collectors.groupingBy(
parts -> Integer.valueOf(parts[0]),
Collectors.mapping(parts -> parts[1], Collectors.toList())
));
为了使代码更清晰,您可以使用简单的foreach
循环:
Stream<String> lines = File.lines(Paths.get("path-to-file");
lines.forEach(s -> s.split(" "));
/**
* Takes a stream, splits group by first part of the string:
*/
public Map<Integer, List<String>> split(Stream<String> a) {
Map<Integer, List<String>> result = new HashMap<>();
a.forEach(s -> {
String[] pair = s.split(" ");
Integer key = Integer.valueOf(pair[0]);
String value = pair[1];
// as 4castle suggested - to avoid unnecessary computation
result.computeIfAbsent(key, key -> new ArrayList<>());
result.get(key).add(value);
});
return result;
}
或者,您可以在流处理中直接映射输入:
a.map(s -> s.split(" "))
.forEach(pair -> {
Integer key = Integer.valueOf(pair[0]);
String value = pair[1];
result.putIfAbsent(key, new ArrayList<>());
result.get(key).add(value);
});
您可以像这样进入HashMap:读取文件并使用String Split函数对其进行分割,然后保存到HashMap键值对中。
public static HashMap<Integer, String> readFile(String fileName) throws IOException {
BufferedReader br = new BufferedReader(new FileReader(fileName));
try {
HashMap<Integer, String> fileData = new HashMap<>();
String line = br.readLine();
while (line != null) {
String[] lineData = line.split(" ");
System.out.println(lineData[0]+" "+lineData[1]);
fileData.put(Integer.valueOf(lineData[0]), lineData[1]);
line = br.readLine();
}
return fileData;
} finally {
br.close();
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.