3

Imagine I have a file like:

1, Apple
1, Pear
1, Orange
2, Apple
3, Melon
3, Orange

I want to parse this into a list with each entry being a map or I guess it could be my own object but I thought a map would be best as it is a key. value.

I was trying:

private List<Map<String, String>> readRecords(String path) {
    return Files.lines(Paths.get(path))
            .map(line -> Arrays.asList(line.split(SEPARATOR)))
            .map(snippets -> new HashMap<Integer, String>().put(Integer.parseInt(snippets.get(0)), snippets.get(1)))
            .collect(Collectors.toList());
}  

List<String>しかし、これにより、との間で変換できないというエラーが表示されますList<Map<String, String>>

それとも、これを行うためのより良い方法がありますか?

4

5 に答える 5

0

元の投稿にコメントを追加すると、これが私が思いついたコードです。明らかに、整数が にマップされた 1 対多の関係が必要であると想定してList<String>ます。

public class MappingDemo {

    public static void main(String[] args) {
        MappingDemo demo = new MappingDemo();
        System.out.println("... Using custom collector ...");
        demo.dumpMap(demo.getFruitMappingsWithCustomCollector());
        System.out.println("... Using 'External' map ...");
        demo.dumpMap(demo.getFruitMappingsWithExternalMap());
    }

    public Map<Integer, List<String>> getFruitMappingsWithCustomCollector(){
        // Resulting map is created from within the lambda expression.
        return getContent().stream().map(s -> s.split(",\\s"))
                .collect(
                      HashMap::new,
                      (map, ary) -> map.computeIfAbsent(Integer.parseInt(ary[0]),
                            k -> new ArrayList<>()).add(ary[1]),
                      (map1, map2) -> map1.entrySet().addAll(map2.entrySet())
                );
    }

    public Map<Integer,List<String>> getFruitMappingsWithExternalMap(){
        // Create the map external from the lambda and add to it.
        final Map<Integer,List<String>> fruitMappings = new HashMap<>();
        getContent().stream().map(s -> s.split(",\\s"))
              .forEach(ary ->
                    fruitMappings.computeIfAbsent(Integer.parseInt(ary[0]),
                          k -> new ArrayList<>()).add(ary[1]));
        return fruitMappings;
    }

    public void dumpMap(Map<Integer,List<String>> map){
        map.entrySet().forEach(e -> System.out.println(e.getKey() + " -> " + e.getValue()));
    }

    public List<String> getContent(){
        return Arrays.asList("1, Apple",
              "1, Pear",
              "1, Orange",
              "2, Apple",
              "3, Melon",
              "3, Orange",
              "1, Mango",
              "3, Star Fruit",
              "4, Pineapple",
              "2, Pomegranate");
    }
}

そして出力

... カスタムコレクターの使用 ...
1 -> [リンゴ、ナシ、オレンジ、マンゴー]
2 -> [リンゴ、ザクロ]
3 -> [メロン、オレンジ、スターフルーツ]
4 -> [パイナップル]
... 「外部」マップを使用 ...
1 -> [リンゴ、ナシ、オレンジ、マンゴー]
2 -> [リンゴ、ザクロ]
3 -> [メロン、オレンジ、スターフルーツ]
4 -> [パイナップル]

誰かがもっとうまくやれると確信しています。

getContent指定したテキストを使用して値を取得するための単純な手段でした。実際Files.readAllLinesに. _getContent()File

于 2015-08-04T17:53:42.520 に答える