提问人:Awin 提问时间:8/4/2023 最后编辑:Awin 更新时间:8/7/2023 访问量:41
使用流和筛选器浏览多个列表并获取字符串
Use a stream and filter to go through multiple lists and get a string
问:
我有两个列表和两张地图,如下所示:
List <String> codes = new ArrayList<>();
List <String> year = new ArrayList<>()
Map<String,Map<String,String> map1 = new HashMap<>();
Map<String,Map<String,String> map2 = new HashMap<>();
codes = [abc,def];
year = [2000,2001]
map1 = {abc={2000=0,2001=1, },def={2000=0.1,2001=0.3, }}
map2 = { abc={2000=0.1,2001=0.2, }}, def={2000=7.8,2001=5.4 }}
从本质上讲,我想制作一个字符串以这种格式获取它,我通过唯一和年份列表以这种格式制作它,其中顺序基于年份,如下所示:
String s = abc,2000,0,0.1, def,2000,0.1,7.8, abc,2001,1,0.2 def,2001,0.3,5.4
我使用 double for 循环来做到这一点,这使得运行时变慢:
for (int i=0; i<codes.size();i++){
for (int j=0;j<year.size();j++){
String s = codes.get(i) + “,” + years.get(j) + “,” + map1.get(codes.get(i).years.get(j)) + “,” + map2.get(codes.get(i).years.get(j))
}
}
有没有办法避免使用for循环,并可能像上面那样使用流和过滤器来解析字符串?
答:
0赞
Reilas
8/7/2023
#1
"...从本质上讲,我想制作一个字符串以这种格式获取它,我通过唯一和年份列表以这种格式制作它,其中顺序基于年份,如下所示:...”
看起来它首先是按年份排序的,然后是代码。
您必须对 year 进行迭代,并在构建字符串时同时检查 map1 和 map2。
Map<String, List<Map<Integer, Number>>> map1
= Map.of("abc", List.of(Map.of(2000, 0), Map.of(2001, 1)),
"def", List.of(Map.of(2000, 0.1), Map.of(2001, 0.3)));
Map<String, List<Map<Integer, Number>>> map2
= Map.of("abc", List.of(Map.of(2000, 0.1), Map.of(2001, 0.2)),
"def", List.of(Map.of(2000, 7.8), Map.of(2001, 5.4)));
String[] codes = { "abc", "def" };
int[] years = { 2000, 2001 };
for (int year : years) {
for (Map.Entry<String, List<Map<Integer, Number>>> entryA : map1.entrySet()) {
for (Map<Integer, Number> valueA : entryA.getValue()) {
if (valueA.containsKey(year)) {
System.out.printf("%s,%d,%s,", entryA.getKey(), year, valueA.get(year));
for (Map.Entry<String, List<Map<Integer, Number>>> entryB : map2.entrySet()) {
if (entryB.getKey().equals(entryA.getKey())) {
for (Map<Integer, Number> valueB : entryB.getValue()) {
if (valueB.containsKey(year)) {
System.out.printf("%s,", valueB.get(year));
break;
}
}
}
}
break;
}
}
System.out.print(" ");
}
}
输出
abc,2000,0,0.1, def,2000,0.1,7.8, abc,2001,1,0.2, def,2001,0.3,5.4,
评论
unique
String code = codes.get(i);
String year = years.get(j);