如何实现数组当前元素减前一个元素?我的parallelPrefix代码为何无效?
问题分析与解决方案
错误原因
你的代码存在几个关键问题,导致数组值未发生变化:
数组长度定义错误
你创建的array长度为matrix[0].length - 1,但你的需求是保留原数组第一个元素,后续元素为相邻差值,结果数组长度应与原数组一致,而非减一。变量名不一致
代码中定义了array变量,但循环里操作的是arr,这会导致编译错误或操作对象错误,根本没修改目标数组。parallelPrefix调用范围无效
你在循环中每次传入[i, i+1)的范围,这个区间是左闭右开的,仅包含索引i的单个元素。parallelPrefix需要至少两个元素才能执行累积运算,因此每次调用都不会对数组做任何修改。对parallelPrefix的用法误解
你不需要循环调用该方法,parallelPrefix本身就是对整个数组(或指定的多元素范围)执行累积归约操作。巧合的是,你定义的(x, y) -> y - x操作符,刚好能直接生成你想要的结果——只需要对整个数组调用一次即可。
正确实现代码
如果允许修改原数组:
double[] arr = {1, 22, 13, 4}; DoubleBinaryOperator operator = (x, y) -> y - x; Arrays.parallelPrefix(arr, operator); // 处理后arr的值为 {1, 21, -8, 12}
如果需要保留原数组,先复制再处理:
double[] original = {1, 22, 13, 4}; double[] result = Arrays.copyOf(original, original.length); DoubleBinaryOperator operator = (x, y) -> y - x; Arrays.parallelPrefix(result, operator); // result为目标数组,original保持不变
补充说明
parallelPrefix的工作逻辑是:
- 第一个元素保持不变;
- 第二个元素 = 操作符(第一个元素, 第二个元素);
- 第三个元素 = 操作符(第二个元素的计算结果, 第三个元素);
- 后续元素以此类推。
对你的需求来说,这个逻辑刚好匹配“当前元素减前一个元素的累积计算”,因此直接调用一次就能得到目标结果。
内容的提问来源于stack exchange,提问作者Hubi
相关产品推荐
相关产品推荐

