使用流和筛选器浏览多个列表并获取字符串

Use a stream and filter to go through multiple lists and get a string

提问人:Awin 提问时间:8/4/2023 最后编辑:Awin 更新时间:8/7/2023 访问量:41

问:

我有两个列表和两张地图,如下所示:

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循环,并可能像上面那样使用流和过滤器来解析字符串?

Java 字符串 解析 过滤器

评论

2赞 Tim Moore 8/4/2023
请提供一个最小的可重复示例。这段代码在断章取义的情况下没有意义,而且很难分辨原始代码中的错别字和真正的错误。
0赞 Awin 8/4/2023
@TimMoore更好,我修好了
1赞 Tim Moore 8/4/2023
谢谢,它好了一点,但仍然不是一个最小的可重现示例,因为它仍然不完整。例如,什么是?这个想法是包含读者可以复制/粘贴以运行和查看问题的代码。unique
0赞 Tim Moore 8/4/2023
此外,问题本身也不是很清楚:“运行时似乎很糟糕”。“坏”有多糟糕?什么会好?
1赞 experiment unit 1998X 8/4/2023
可能并不完全是由于使用了 for 循环,而是由于冗余操作。为什么在 j 迭代时 codes.get(i) 没有变化时调用它?将其提取到变量中 当您已经获得所需的值时,将其提取到变量中,调用一次,根据需要多次使用。String code = codes.get(i);String year = years.get(j);

答:

0赞 Reilas 8/7/2023 #1

"...从本质上讲,我想制作一个字符串以这种格式获取它,我通过唯一和年份列表以这种格式制作它,其中顺序基于年份,如下所示:...”

看起来它首先是按年份排序的,然后是代码

您必须对 year 进行迭代,并在构建字符串时同时检查 map1map2

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,