在 Java 中计算数组索引中的总和

Calculating a sum within an array index in Java

提问人:Jason Clark 提问时间:5/21/2020 最后编辑:Jason Clark 更新时间:5/21/2020 访问量:992

问:

解决方案:我在其他地方使用,我的代码的第二个变体没有更新它,因此问题稍后出现在我的代码中。相当愚蠢,令人尴尬,但哦,好吧!sum

这是一个工作 Java 代码块:

int sum = 0;

for (int r = 0; r < k; r++) {
  sum += matrix[r][c];
}

totals[0][c] = sum;

k行中的元素被汇总到 中,然后存储在相应的索引中。rsumtotals

我的问题是,为什么我不能有这样的代码?

for (int r = 0; r < k; r++) {
  totals[0][c] += matrix[r][c];
}

我没有使用单独的整数,而是简单地在正确的索引中计算所述总和?这会产生一个不同的、非常错误的输出。这是一个好的做法还是坏的做法?为了澄清,此时初始化为所有 0。sumtotalstotals

我有一种感觉,我错过了一些相当简单的东西,但我正在努力找到有关该主题的任何有用信息,包括我在 Java 中发现的有关数组性质的信息。

Java 数组 变量 值 赋值运算符

评论

0赞 Michael 5/21/2020
"用变量被掩盖,以避免被我的同龄人识别“如果在这里问在某种程度上是不受欢迎的,那你为什么要这样做?
3赞 Eran 5/21/2020
如果初始化为 0,则两个代码段应产生相同的输出。totals[0][c]
0赞 Jason Clark 5/21/2020
@Michael 我们不允许分享答案或大量代码,但这是一个关于 Java 的问题,而不是算法。对于我的“相关”命名变量,我正在适应的算法及其相关的问题将相当明显。
0赞 Michael 5/21/2020
很公平。好吧,Eran是对的,所以这个问题目前是不可重复的。你说它给出了“非常错误的输出”,但如果没有进一步的上下文,我们无法告诉你为什么改变这些行会改变行为。
1赞 vsfDawg 5/21/2020
对您的问题的简短回答是,如果您正在修改的“总计”中的位置在您进入循环时为 0,则它将按照您的预期运行。至少,您应该包括一些示例输入/输出,以产生正确和错误的答案。我认为你没有展示的东西存在问题——如何管理和管理......还可以使用调试器或 print 语句来监视计算。totalsc

答:

0赞 user404 5/21/2020 #1

要分解代码,请执行以下操作:

totals[0][c] += matrix[r][c];

方法

totals[0][c] = totals[0][c] + matrix[r][c];

所以现在,从你的第一次循环迭代开始考虑,你不想添加任何以前存储在totals[0][c]中的值,对吧?for

现在,有什么方法可以避免并以这种方式做同样的事情?只需在添加之前初始化为 0。

totals[0][c] = 0;

for (int r = 0; r < k; r++) {
  totals[0][c] += matrix[r][c];
}

评论

0赞 Jason Clark 5/21/2020
感谢您的回复!我知道你来自哪里,但不幸的是我已经尝试过了。既可以按照您演示的方式进行演示,也可以遍历整个总计 2D 数组,将其所有值分配给 0。据我了解,初始化任何具有给定大小的数组已经将其值设置为 0,但我认为值得一试。
0赞 user404 5/21/2020
这应该不是问题,如果数组正确初始化,应该可以解决我提到的您的情况。顺便说一句,你有什么错误吗?
0赞 Jason Clark 5/21/2020
没有错误,只是输出不正确,线性小于预期。随着输入的增长,输出会进一步不正确。我已经测试了数组的所有元素是否实际上都初始化为 0,并且它们位于 for 循环之前。
0赞 user404 5/21/2020
据我所知,我可以向你保证,如果你在问题添加问题中提到的那条线是你想要实现的,那么这是正确的。如果这不符合您的期望,我认为问题出在其他地方,而不是这里的代码。更好的是,尝试一些新的矩阵示例集,用笔和纸执行,然后执行代码并对结果进行交叉验证,结果和原因都是错误的。
0赞 Jason Clark 5/21/2020
回到纸笔吧!虽然说实话,但我认为我可能专注于一个非问题。我的原始代码是有效的,所以我不妨坚持下去 - 我主要只是好奇 Java 中是否有一些我不知道的数组行为。感谢您的建议,感谢您抽出宝贵时间回复!
0赞 Eric Gutiérrez 5/21/2020 #2

您需要初始化 的值。totals[0][c] = 0

为此,您可以在创建矩阵时执行以下操作:

Float[] array = new Float[c];
Arrays.fill(array, 0f);
totals.add(array);

for (int r = 0; r < k; r++) {
  totals[0][c] += matrix[r][c];
}

评论

0赞 Jason Clark 5/21/2020
不幸的是,将 totals[0][c](以及所有总计)初始化为 0 对输出没有影响。不过,据我所知,在 Java 中初始化 int 数组已经将所有值设置为 0。这是不正确的吗?
-1赞 Jason Clark 5/21/2020 #3

我在代码的其他地方使用了它,我最初把它看作是一个新的总和,而不是原来的总和。由于我的第二个代码变体没有更新,因此第二次使用它是不正确的。我犯了愚蠢的错误,但生活和学习。sumsum