【问题标题】:Variable values not being saved after being updated in for loop在 for 循环中更新后未保存变量值
【发布时间】:2018-09-21 06:24:04
【问题描述】:

我正在尝试使用 for 循环来更新先前声明的变量,并且在循环内变量值更新正常(使用 print 语句进行检查)。但是,在循环结束后,如果我在循环外使用 print 语句检查值,它们与循环之前的值相同,并且没有更新以供我在其他地方使用。

public class Intervals {

public static void main(String[] args) {

    // Declaring necessary constants
    int MINUTES_IN_DAY = 1440;
    int MINUTES_IN_HOUR = 60;

    // Take user inputs for interval start and end times in hours
    Scanner input = new Scanner(System.in);
    System.out.print("Enter the earlier interval's start and end time in 24-hour time format. ");
    int intervalStart1 = input.nextInt();
    int intervalEnd1 = input.nextInt();
    System.out.print("Enter the later interval's start and end time in 24-hour time format. ");
    int intervalStart2 = input.nextInt();
    int intervalEnd2 = input.nextInt();


    // For-each loop that converts all 24-hour times to minutes after midnight
    int times[] = {intervalStart1, intervalEnd1, intervalStart2, intervalEnd2};
    for (int i: times) {
        i = (i / 100 * MINUTES_IN_HOUR) + (i % 100);
        System.out.println("the interval is " + i);
    }

    // ERROR: values from for loop are not being saved, so variable values are not being updated as shown in next print line.

    System.out.println(intervalStart1);

【问题讨论】:

  • 在您的循环中,您更新的唯一值是 i,它是循环范围内的局部变量。一旦循环结束,这个变量就会存在。
  • 这是有道理的。有没有办法让我使用循环来全局而不是本地更新变量?
  • 您要更新哪个变量?
  • 我正在尝试修改数组中的所有变量而不写出四个单独的转换语句。
  • 我找到了答案;谢谢你的帮助!

标签: java for-loop


【解决方案1】:

你做了两个错误的假设。

  1. 将值分配给增强型 for 循环的循环变量不会更改您正在迭代的数组(或 Iterable)的相应元素。您的循环相当于:

    for (int index = 0; index < times.length; index++) {
        int i = times[index];
        i = (i / 100 * MINUTES_IN_HOUR) + (i % 100);
        System.out.println("the interval is " + i);
    }
    

    这显然不会更新数组中的值。为了修改数组,你必须写:

    for (int index = 0; index < times.length; index++) {
        times[index] = (times[index] / 100 * MINUTES_IN_HOUR) + (times[index] % 100);
        System.out.println("the interval is " + times[index]);
    }
    
  2. 您的数组包含从其他变量(例如intervalStart1)初始化的值。即使您更改了数组中的值(您没有),也不会更改原始变量的值。

【讨论】:

  • 我现在明白为什么这些值没有改变。那么如何修改原始变量的值而不仅仅是修改数组呢?
  • @marsiwala 您必须在循环后修改原始变量。例如:intervalStart1 = times[0]。我会考虑摆脱原始变量并仅使用数组。
  • 既然我要求用户输入,我不需要原始变量来为数组提供值吗?抱歉,我还是个新手。
  • @marsiwala 您可以使用int[] times = new int[4] 初始化数组;然后将用户输入分配给times[0]times[1]等...
【解决方案2】:
int times[] = {intervalStart1, intervalEnd1, intervalStart2, intervalEnd2};
for (int i: times) {
    i = (i / 100 * MINUTES_IN_HOUR) + (i % 100);
    System.out.println("the interval is " + i);
}

i 是数组中值的副本,它不像指针,更新i 只会更新副本,在下一次循环迭代中被丢弃。

【讨论】:

    【解决方案3】:
    // For-each loop that converts all 24-hour times to minutes after midnight
    int times[] = {intervalStart1, intervalEnd1, intervalStart2, intervalEnd2};
    for (int i: times) {
        i = (i / 100 * MINUTES_IN_HOUR) + (i % 100);
        System.out.println("the interval is " + i);
    }
    
    // ERROR: values from for loop are not being saved, so variable values are not being updated as shown in next print line.
    
    System.out.println(intervalStart1);`
    

    我想你想更新 times[] 数组的值对吗?

    所以如果你想更新这个做一件事使用正常循环即

    for(int i =0;  i < times.length;i++){
      times[i] = (times[i]/100*MINUTES_IN_HOUR) + (I % 100);
      System.out.println("the interval is  "+times[i]);
    }
    System.out.println(times[0]);`
    

    但如果你想更新,请考虑一件事

    间隔开始1

    变量那么你必须在循环之后从时间数组中分配这个值。

    我希望它对你有用。

    【讨论】:

      【解决方案4】:

      您没有更新它们,在您获得值 i 之后,它将不再引用数组中的值。这是一个副本。

         int times[] = {intervalStart1, intervalEnd1, intervalStart2, intervalEnd2};
          for (int i: times) {
              i = (i / 100 * MINUTES_IN_HOUR) + (i % 100);
              System.out.println("the interval is " + i);
          }
      

      要更新,您必须在循环中修改它们,使用一些 index 变量来访问元素并更新它们

        int index=0;
        int times[] = {intervalStart1, intervalEnd1, intervalStart2, intervalEnd2};
          for (int i: times) {
              times[index++] = (i / 100 * MINUTES_IN_HOUR) + (i % 100);
              System.out.println("the interval is " + i);
          }
      
      System.out.println(times[0]);
      

      【讨论】:

      • 非常感谢,我现在明白了。
      • @marsiwala 那仍然不会更新原始变量(intervalStart1、intervalEnd1 等...)
      • @Eran 你能解释一下原因吗?
      • @TheScientificMethod 该数组保存原始变量值的副本。如果为数组分配新值,则用于初始化数组的原始变量的值不受影响。
      • 是的,我的原始问题应该更清楚。我想更新原始变量而不是数组中的值。我现在找到了答案;谢谢你们的帮助!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-21
      • 1970-01-01
      • 2019-11-10
      相关资源
      最近更新 更多