如何提取每列数据?
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
循环代替。
问题一:如何使用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
循环代替。