Java 8 循环特殊金字塔逻辑

我有一个 我需要按照下面的迭代逻辑找到给定元素的总和。例如,第一个外部迭代像640 + 480,然后是640 + 480 + 520,依此类推直到60。List<Integer> list=Arrays.asList(640,480,520,170,320,140,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逻辑来求和


翻过高山走不出你
浏览 87回答 2
2回答

白板的微信

我觉得这和算法更相似,让我们一步一步来1) 首先通过排除每次迭代中的第一个整数来获取所有子列表List<Integer>&nbsp;list=Arrays.asList(640,480,520,170,320,140,60); &nbsp;&nbsp;&nbsp;&nbsp;List<List<Integer>>&nbsp;re&nbsp;=&nbsp;IntStream.range(0,&nbsp;list.size()) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.mapToObj(sb->list.subList(sb,&nbsp;list.size())) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.filter(s->s.size()>1) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.collect(Collectors.toList()); &nbsp;&nbsp;&nbsp;&nbsp;re.forEach(ls->System.out.println(ls));输出[640,&nbsp;480,&nbsp;520,&nbsp;170,&nbsp;320,&nbsp;140,&nbsp;60] [480,&nbsp;520,&nbsp;170,&nbsp;320,&nbsp;140,&nbsp;60] [520,&nbsp;170,&nbsp;320,&nbsp;140,&nbsp;60] [170,&nbsp;320,&nbsp;140,&nbsp;60] [320,&nbsp;140,&nbsp;60] [140,&nbsp;60]2)现在在每个列表上进行求和List<List<Integer>>&nbsp;re1&nbsp;=&nbsp;re.stream() &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.map(j->IntStream.rangeClosed(2,&nbsp;j.size()).mapToObj(sl->j.stream().limit(sl).mapToInt(Integer::intValue).sum()).collect(Collectors.toList())) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.collect(Collectors.toList()); &nbsp;re1.forEach(ls->System.out.println(ls));输出[1120,&nbsp;1640,&nbsp;1810,&nbsp;2130,&nbsp;2270,&nbsp;2330] [1000,&nbsp;1170,&nbsp;1490,&nbsp;1630,&nbsp;1690] [690,&nbsp;1010,&nbsp;1150,&nbsp;1210] [490,&nbsp;630,&nbsp;690] [460,&nbsp;520] [200]步骤 1 和步骤 2 的组合解决方案List<List<Integer>>&nbsp;re&nbsp;=&nbsp;IntStream.range(0,&nbsp;list.size()) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.mapToObj(sb->list.subList(sb,&nbsp;list.size())) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.filter(s->s.size()>1) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.map(j->IntStream.rangeClosed(2,&nbsp;j.size()).mapToObj(sl->j.stream().limit(sl).mapToInt(Integer::intValue).sum()).collect(Collectors.toList())) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.collect(Collectors.toList());

守着一只汪

如果您只想转换您拥有的代码,则可以使用以下代码段:List<Integer>&nbsp;result&nbsp;=&nbsp;IntStream.range(0,&nbsp;list.size()) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.mapToObj(i&nbsp;->&nbsp;list.subList(i,&nbsp;&nbsp;list.size())) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.flatMap(l&nbsp;->&nbsp;IntStream.rangeClosed(1,&nbsp;l.size()).mapToObj(i&nbsp;->&nbsp;l.subList(0,&nbsp;i).stream().reduce(0,&nbsp;Integer::sum))) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.collect(Collectors.toList());这将创建一个 from to 并映射应对项目进行汇总的所有列表。这些列表将再次映射到实际项目以计算总和。这在步骤中处于打开状态。最后,所有流都将平展到结果列表中的 finaly:Intstream0n - 1reduce[640,&nbsp;1120,&nbsp;1640,&nbsp;1810,&nbsp;2130,&nbsp;2270,&nbsp;2330,&nbsp;480,&nbsp;1000,&nbsp;1170,&nbsp;1490,&nbsp;1630,&nbsp;1690,&nbsp;520,&nbsp;690,&nbsp;1010,&nbsp;1150,&nbsp;1210,&nbsp;170,&nbsp;490,&nbsp;630,&nbsp;690,&nbsp;320,&nbsp;460,&nbsp;520,&nbsp;140,&nbsp;200,&nbsp;60]
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java