我需要帮助创建这个javaMap吗?

mcvgt66p  于 2021-06-30  发布在  Java
关注(0)|答案(2)|浏览(349)

我有一个包含以下数据的文本文件:

a, 0, 10, 7, 
b, 22, 0, 13, 
c, 4, 12, 0

我想创建一个键为字母、值为 ArrayList<Integer>int 与该字母相关的值。
这就是我尝试过的:

List<String> list = new ArrayList<String>();
        while(scanner.hasNext()){
        list.add(scanner.nextLine());

    }

    Map <String, ArrayList <Integer>> map = new HashMap();
    //map.put(list.get(0).charAt(0), value);

}

Map的关键部分是通过获取字母来工作的,但我不确定如何正确地实现要成为 ArrayList <Integer> 价值观。

cotxawn7

cotxawn71#

您只需要一个循环就可以遍历行并获取第一个+剩余的列
例如,

Map <String, ArrayList <Integer>> map = new HashMap<>();

while(scanner.hasNext()){
    String[] parts = scanner.nextLine().split("\\s*,\\s*");
    List<Integer> numbers = Arrays.stream(Arrays.copyOfRange(parts, 1, parts.length))
        .map(Integer::parseInt)
        .collect(toList());
    map.put(parts[0], numbers);
}

注意:您可能需要删除每行末尾的逗号

xytpbqjk

xytpbqjk2#

好吧,这里有一个稍微不同的方法。
允许不太具体的格式和尾随空格。
使用 Files.lines 方法来流式处理行。
假定文件中有三行以上的行,因此添加一个合并函数来处理重复的键(如果出现)。

String sourceFile = "<Your file here>";
Map<String, List<Integer>> map;
try {
    map = Files.lines(Path.of(sourceFile))
            .map(String::trim)
            .map(str -> str.split("\\s*,\\s*"))
            .collect(Collectors.toMap(a -> a[0], a -> Arrays
                    .stream(Arrays.copyOfRange(a, 1, a.length))
                    .map(Integer::valueOf)
                    .collect(Collectors.toList()),
                    (list1,list2)-> {list1.addAll(list2); return list1;}));
} catch (IOException fne) {
    fne.printStackTrace();
}
map.entrySet().forEach(System.out::println);

因此给出如下文件:

a, 0, 10, 7, 
b, 22, 0, 13, 
c, 4,12,0 
c,4,12,12
a,9,2,3

印刷品

a=[0, 10, 7, 9, 2, 3]
b=[22, 0, 13]
c=[4, 12, 0, 4, 12, 12]

相关问题