【问题标题】:Sum of subtractions using Java Stream API使用 Java Stream API 的减法总和
【发布时间】:2017-07-29 01:26:08
【问题描述】:

每个人。

我遇到了一项任务,对我来说看起来很简单,但我花了大约 4 个小时却一无所获。所以,让我们假设我们有一个简单的整数列表,比如

[1, 2, 3, 4, 5]

我想得到每个元素的减法总和 - 对于这个列表,它将等于 4 -> (2 - 1) + (3 - 2)... 等等。

为了避免使用范围的答案,列表可能如下所示:

[5, 12, 16, 25, 25, 48]

它总是在增长,但两者之间的范围不同。

使用简单的 for 不难得到类似的东西:

    int result = 0;
    for (int i = 1; i < lst.size(); i++) {
        result += lst.get(i) - lst.get(i-1);
    }

但是当我尝试使用流解决这个案例时,我觉得自己完全愚蠢。

这真的可能吗?

【问题讨论】:

  • 你计算的只是lst.get(lst.size()-1) - lst.get(0)——最后一个元素减去第一个元素。
  • 流设计用于一次处理一个项目。您想要处理项目并包括其邻居的上下文。使用流并非不可能完成,但同样没有理由使用它们。
  • @Michael 如果列表为[1,2,3,4,1],则结果为0,仍然是最后一个元素减去第一个元素。
  • @Michael (2-1) + (3-2) + (4-3) + (1-4) 等于 0,所以 khelwood 的解决方案仍然有效
  • @khelwood 原来如此。数学不好。

标签: java java-8 java-stream


【解决方案1】:

假设你有一个这样的整数列表:[ n0, n1, n2, ... , nM, nN ],你正在做的是:

  1. 创建列表[(n1 - n0), (n2 - n1), (n3 - n2), ..., (nN - nM)]
  2. 该列表的总和:X = (n1 - n0) + (n2 - n1) + (n3 - n2) + ... + (nN - nM)。 这与X = (-n0) + (n1 - n1) + (n2 - n2) + ... + (nM - nM) + nN ] 完全相同(只是交换了括号内部,因为它们无关紧要)。

这是(正如其他人指出的)X = nN - n0无论您的列表中有什么null除外)。

因此,lst.get(lst.size()-1) - lst.get(0) 是迄今为止最好的答案。

【讨论】:

  • 是的,我明白了。谢谢。
【解决方案2】:

试试这个:

int result = IntStream.range(1, lst.size())  // creates a stream of indexes from 1 to lst.size()
        .map(i -> lst.get(i) - lst.get(i-1)) // maps the new value into a new stream
        .sum();                              // sums it up

【讨论】:

  • 这基本上只是一个奇怪的寻找循环。
  • 我已经用另一个列表示例编辑了这个问题。
  • @AlbertZoich 我的示例仍然可以正常工作,因为生成的 intStream 仅包含索引
猜你喜欢
  • 2017-02-12
  • 2018-07-24
  • 2021-09-13
  • 2017-11-10
  • 1970-01-01
  • 2020-01-20
  • 2022-01-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多