我有一个巨大的.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(" "));
`
答案 0 :(得分:1)
我相信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
方法没有给你最可读的输出,但我相信它是你要求的地图。目前,每个列表中只有一个字符串,但如果多行具有相同的分数,则会有更多。
答案 1 :(得分:1)
将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())
));
答案 2 :(得分:0)
为了使代码更清晰,您可以使用简单的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);
});
答案 3 :(得分:0)
你可以像这样进入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();
}
}