【问题标题】:How to add to every value some other value in foreach loop?如何在 foreach 循环中为每个值添加一些其他值?
【发布时间】:2017-05-12 09:49:48
【问题描述】:

我有一个双精度数组:

double[] arrayOfDoubles = new double[]{doubleVal1, doubleVal2, doubleVal3, doubleVal4, doubleVal5, doubleVal6};

和 doubleValues 初始化:

double doubleVal1 = 0;
double doubleVal2 = 0;
double doubleVal3 = 0;
double doubleVal4 = 0;
double doubleVal5 = 0;
double doubleVal6 = 0;

现在我在该数组中使用 foreach 循环:

for (double val : arrayOfDoubles)
{
    val += 0.1;
}

我认为它应该添加到每个值(doubleVal1,doubleVal2...,doubleVal6)值 0.1。

我应该改变什么来获得它?

【问题讨论】:

  • 您正在增加数量,但没有更新数组。

标签: java arrays loops foreach


【解决方案1】:

高级 for 循环无法做到这一点,因为 val 包含从数组中获取的值的副本,因此修改它不会修改数组。

改用常规的 for 循环:

for (int i = 0; i <  arrayOfDoubles.length; i++)
{
    arrayOfDoubles[i] += 0.1;
}

【讨论】:

  • 使用 foreach 循环是不可能的?
  • 太棒了,我不知道 val 包含一个值的副本。谢谢。
  • @MadMike6661 除非您创建一个计数器变量,在循环中递增它,并使用它来更新 arrayOfDoubles[i] 而不是 val。您不妨使用普通的 for 循环。
  • 确实如此。您可以从字面上看到,为每个循环增量创建了一个新的 'double val'。
【解决方案2】:

使用常规的for 循环,而不是foreach,这样您就可以访问数组的索引。

for (int i = 0 ; i<arrayOfDoubles.length; i++)
{
    arrayOfDoubles[i] += 0.1;
}

也可以看看:Is Java “pass-by-reference” or “pass-by-value”?

【讨论】:

  • 我犹豫是否将其标记为重复,但在这里看到它就足够了
【解决方案3】:

你可以像这样使用 foreach :

int i = 0;
for (double val : arrayOfDoubles) {
    arrayOfDoubles[i] += 0.1;
    i++;
}

因为实际上为每个创建一个临时变量而不使用数组的实际值,所以它像这样工作

for (int i = 0; i < arrayOfDoubles.length; i++) {
    double val = arrayOfDoubles[i];
    //      ^^---------------------------------for each create a temp variable like this
}

【讨论】:

  • 使用等效代码的非常好的答案!请注意,这不是非原始对象的问题(除非创建新实例或不可变实例);)
【解决方案4】:

您应该将循环从增强的for 循环更改为常规的for 循环,因为循环变量修改不会反映在原始项目上:

for (int i = 0 ; i != arrayOfDoubles.length ; i++) {
    arrayOfDoubles[i] += 0.1;
}

请注意,此更改仍不会对字段 doubleVal1..doubleVal6 产生影响,这些字段会在初始化时复制arrayOfDoubles。如果不直接引用它们或使用反射(绝对不推荐用于此任务),则无法修改它们。

如果您的最终目标是修改字段 doubleVal1..doubleVal6,请考虑以将这些字段永久放入数组的方式重构您的类。

【讨论】:

    【解决方案5】:

    我猜重点是更改变量值,而不是数组的值。但这对于原语是不可能的。

    您可以创建一个简单的类来保存该值,但我相信您的任务有更好的设计方法:

    class DoubleHolder {
        double val;
    }
    
    DoubleHolder doubleVal1 = new DoubleHolder();
    DoubleHolder doubleVal2 = new DoubleHolder();
    DoubleHolder doubleVal3 = new DoubleHolder();
    DoubleHolder doubleVal4 = new DoubleHolder();
    DoubleHolder doubleVal5 = new DoubleHolder();
    DoubleHolder doubleVal6 = new DoubleHolder();
    
    DoubleHolder[] arrayOfDoubles = {doubleVal1, doubleVal2, doubleVal3, doubleVal4, doubleVal5, doubleVal6};
    
    for (DoubleHolder dh : arrayOfDoubles) {
        dh.val += 0.1;
    }
    
    System.out.print(doubleVal3.val);      // prints 0.1
    

    【讨论】:

      猜你喜欢
      • 2015-09-28
      • 1970-01-01
      • 1970-01-01
      • 2015-07-03
      • 1970-01-01
      • 2017-10-14
      • 2021-10-19
      • 1970-01-01
      • 2014-09-14
      相关资源
      最近更新 更多