如何提取每列数据?

How to extract each column data?

问题一:如何使用java函数式编程提取每一列数据?

问题2: 如何提取每一列数据然后放入Map>?

Output of the data

上面屏幕截图中显示的输出是从 List<List<String>> covidListWithoutCountryDetails

打印的

我的尝试(但失败了):

Map<String, List<String>> dateWithEachDayAmountCases= new HashMap<>();
        covidListWithoutCountryDetails
                .stream()
                .map(x-> dateWithEachDayAmountCases.put(covidListWithoutCountryDetails.get(0).get(0),zeroIndexList))
                .collect(Collectors.toList())
                        .forEach(x->System.out.println(x));

期望输出:

{2020/1/22=[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]}
{2020/1/23=[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]}
{2020/1/24=[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]}
...............
...............
...............
more and more until the end 

好的,你说你的数据在List<List<String>>中。然后试试这个。

  • 流式传输列表。
  • 使用每个列表的第一个元素作为键
  • 使用从 1 到列表末尾的 subList 作为值。
List<List<String>> data = your data
        
Map<String,List<String>> map = data.stream()
        .collect(Collectors.toMap(list -> list.get(0),
                list -> new ArrayList<>(
                        list.subList(1, list.size()))));

map.entrySet().forEach(System.out::println);

由于第一行包含日期 headers,其余行包含值,因此可能值得为第一“行”准备一个键列表,然后为每个键准备一个包含空数组列表的映射,然后填充每个日期的列数据。
注意:使用 LocalDate 而不是过时的 Date class

List<List<String>> data = Arrays.asList(
    Arrays.asList("2020/12/31", "2021/01/01", "2021/02/01", "2021/03/01"),
    Arrays.asList("1",   "2",  "3",  "4"),
    Arrays.asList("10", "20", "30", "40"),
    Arrays.asList("20", "40", "60", "80")
);

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy/MM/dd");

List<LocalDate> keys = data.get(0).stream().map(s -> LocalDate.parse(s, formatter)).collect(Collectors.toList());

Map<LocalDate, List<Integer>> map = new LinkedHashMap<>();

IntStream.range(0, data.get(0).size())
    .forEach(i -> map.put(keys.get(i), new ArrayList<>()));

data.stream()
    .skip(1)
    .forEach(row -> IntStream.range(0, row.size()) // iterate "columns" by index
        .forEach(i -> map.get(keys.get(i))
                    .add(Integer.parseInt(row.get(i)))
        )
    );
    
System.out.println(map);

输出:

{2020-12-31=[1, 10, 20], 2021-01-01=[2, 20, 40], 2021-02-01=[3, 30, 60], 2021-03-01=[4, 40, 80]}

但是,Stream API 看起来不太适合此任务,可以使用旧的 for 循环代替。