我有一个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 Logic for sum
我觉得这与算法更相似,让我们一步一步走
1)首先通过在每次迭代中排除第一个整数来获取所有子列表
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));
产量
[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)现在在每个列表上做总和
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));
产量
[1120, 1640, 1810, 2130, 2270, 2330]
[1000, 1170, 1490, 1630, 1690]
[690, 1010, 1150, 1210]
[490, 630, 690]
[460, 520]
[200]
步骤1和步骤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());
如果您只想转换代码,可以使用以下代码段:
List<Integer> result = IntStream.range(0, list.size())
.mapToObj(i -> list.subList(i, list.size()))
.flatMap(l -> IntStream.rangeClosed(1, l.size()).mapToObj(i -> l.subList(0, i).stream().reduce(0, Integer::sum)))
.collect(Collectors.toList());
这会创建一个从Intstream
到0
的n - 1
,并映射所有项目应该总结的列表。这些列表再次映射到实际项目以计算总和。这是在reduce
步骤中。最后,所有流都被展平,最后收集到结果列表:
[640, 1120, 1640, 1810, 2130, 2270, 2330, 480, 1000, 1170, 1490, 1630, 1690, 520, 690, 1010, 1150, 1210, 170, 490, 630, 690, 320, 460, 520, 140, 200, 60]