如何使用Java从流中拆分字符串

时间:2017-03-28 14:29:41

标签: java java-stream

我有一个巨大的.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(" "));

`

4 个答案:

答案 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();
    }
}