首页 > 解决方案 > Java 8 循环特殊金字塔逻辑

问题描述

我有一个List<Integer> list=Arrays.asList(640,480,520,170,320,140,60); 并且我需要根据下面的迭代逻辑找到给定元素的总和。例如第一个外部迭代,如 640+480,然后 640+480+520,依此类推,直到 60。

下一次迭代从 480+520 开始,然后是 480+520 +170 等等。

示例 Java 7 程序就像

List<Integer> list=Arrays.asList(640,480,520,170,320,140,60);
        List<Integer> newListWithSum=new ArrayList<>();
        for(int mainIndex=0;mainIndex<list.size();mainIndex++) {
            for(int index=mainIndex;index<list.size();index++) {
                int sum=0;
                for(int nestedIndex=mainIndex;nestedIndex<index+1;nestedIndex++) {
                    sum=sum+list.get(nestedIndex);
                }
                newListWithSum.add(sum);
            }
        }

但我需要将上述逻辑更改为 Java 8 版本。请帮助/分享提示以根据以下迭代编写简化的 Java 8 逻辑求和

在此处输入图像描述

标签: javaloopsforeachjava-8java-stream

解决方案


I feel this is much more similar to algorithm, let's go step by step

1) First get all the sublists by excluding first integer in each iteration

List<Integer> list=Arrays.asList(640,480,520,170,320,140,60);

    List<List<Integer>> re = IntStream.range(0, list.size())
                                      .mapToObj(sb->list.subList(sb, list.size()))
                                      .filter(s->s.size()>1)
                                      .collect(Collectors.toList());

    re.forEach(ls->System.out.println(ls));

Output

[640, 480, 520, 170, 320, 140, 60]
[480, 520, 170, 320, 140, 60]
[520, 170, 320, 140, 60]
[170, 320, 140, 60]
[320, 140, 60]
[140, 60]

2) Now on each list do the sum

List<List<Integer>> re1 = re.stream()
                            .map(j->IntStream.rangeClosed(2, j.size()).mapToObj(sl->j.stream().limit(sl).mapToInt(Integer::intValue).sum()).collect(Collectors.toList()))
                            .collect(Collectors.toList());

 re1.forEach(ls->System.out.println(ls));

Output

[1120, 1640, 1810, 2130, 2270, 2330]
[1000, 1170, 1490, 1630, 1690]
[690, 1010, 1150, 1210]
[490, 630, 690]
[460, 520]
[200]

Combined solution of step 1 and step 2

List<List<Integer>> re = IntStream.range(0, list.size())
                                      .mapToObj(sb->list.subList(sb, list.size()))
                                      .filter(s->s.size()>1)
                                      .map(j->IntStream.rangeClosed(2, j.size()).mapToObj(sl->j.stream().limit(sl).mapToInt(Integer::intValue).sum()).collect(Collectors.toList()))
                                      .collect(Collectors.toList());

推荐阅读