繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM