Значения переменных не сохраняются после обновления в цикле for - PullRequest
0 голосов
/ 21 сентября 2018

Я пытаюсь использовать цикл 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);

Ответы [ 4 ]

0 голосов
/ 21 сентября 2018
// 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 [], верно?

, поэтому, если вы хотите обновить это, выполните 1 вещь, используя обычный цикл, т.е.

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]);`

НоУчтите одну вещь, если вы хотите обновить переменную

intervalStart1

, тогда вам нужно присвоить эти значения из массива times после цикла.

Iнадеюсь, что это будет работать для вас.

0 голосов
/ 21 сентября 2018

Вы делаете два неверных предположения.

  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).Даже если вы изменили значения в вашем массиве (чего у вас нет), это не изменит значения исходных переменных.

0 голосов
/ 21 сентября 2018

вы не обновляете их, после получения значения 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]);
0 голосов
/ 21 сентября 2018
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 обновит только копию, которая будет выброшена на следующей итерации цикла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...