【问题标题】:Calculating a sum within an array index in Java在Java中计算数组索引内的总和
【发布时间】:2020-09-07 23:16:31
【问题描述】:

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

这是一段工作 Java 代码:

int sum = 0;

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

totals[0][c] = sum;

r 行中的k 元素在sum 中相加,然后存储在totals 中相应索引处。

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

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

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

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

【问题讨论】:

  • 为了避免被我的同行认出而掩盖了变量
  • 如果totals[0][c]被初始化为0,两个sn-ps应该产生相同的输出。
  • @Michael 我们不允许分享答案或大量代码,但这是关于 Java 的问题,而不是算法问题。使用我的“相关”命名变量,我正在适应的算法及其相关的问题将相当明显。
  • 很公平。好吧,Eran 是对的,所以这个问题目前无法重现。您说它给出了“非常错误的输出”,但没有进一步的上下文,我们无法告诉您为什么更改这些行会改变行为。
  • 对您的问题的简短回答是,如果您在进入循环时正在修改的“totals”中的位置为 0,它将按预期运行。至少,您应该包含一些示例输入/输出,它会产生正确和错误的答案。我认为您未显示的内容存在问题 - 如何管理 totalsc。您还可以使用调试器或打印语句来监控计算。

标签: java arrays variable-assignment assignment-operator


【解决方案1】:

分解你的代码:

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

意思是,

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

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

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

totals[0][c] = 0;

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

【讨论】:

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

【讨论】:

  • 不幸的是,将 totals[0][c](和所有的总数)初始化为 0 对输出没有影响。不过,据我了解,在 Java 中初始化一个 int 数组已经将所有值设置为 0。这不正确吗?
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 2013-08-14
    • 1970-01-01
    • 2021-12-16
    • 2021-12-07
    • 2014-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多