Java - цикл For выполняется после завершения условия - PullRequest
0 голосов
/ 03 сентября 2018

Я отладил этот код, и он, кажется, запускает цикл for, хотя условие завершения выполнено.

Эта программа принимает два типа ввода:

Строка 1 - Сколько точек данных существует (N)

Строки от 2 до N - Точки данных

Затем программа должна распечатать наименьшую разницу между всеми точками данных.

Так, например, пример ввода будет (в отдельных строках): 3 5 8 9

Есть 3 точки данных (5 8 9), и наименьшая разница между 8 и 9, поэтому программа должна вернуть 1.

Я пытаюсь построить программу так, чтобы точки данных заполнялись в массив одновременно с выполнением сравнений. Очевидно, я мог бы разделить эти проблемы, но я экспериментирую. Вот оно:

package com.m3c.vks.test;
import java.util.*;
import java.io.*;
import java.math.*;

class Solution {

    public static void main(String args[]) {
        Scanner in = new Scanner(System.in);
        int N = in.nextInt(); //How many data points there will be
        int strengthArray[] = new int[N]; //Initialise the array to be of length = N, the first input line
        int tempStrengthDifference=99999; //junk difference set arbitrarily high - bad practice I know
        int lowestStrengthDifference=99999;
        for (int i = 0; i < N; i++) //Go through all elements of array
        {
            strengthArray[i] = in.nextInt(); //read a value for the ith element
            System.out.println("i: " + i); //test
            if (i > 0) //do not execute the next for loop if i = 0 as cannot evaluate sA[-1]
            {
                for (int j = i - 1; j < 1; j--) // **this is line 20** from wherever the array has populated up to, work backwards to compare the numbers which have been fed in thus far
                {
                    System.out.println("j: " + j); //test
                    tempStrengthDifference = Math.abs(strengthArray[i] - strengthArray[j]); //finding the difference between two values
                    if (tempStrengthDifference < lowestStrengthDifference) //store the lowest found thus far in lowestSD
                    {
                        lowestStrengthDifference = tempStrengthDifference;
                    }
                }
            }
        }
        System.out.println(lowestStrengthDifference);
    }
}

Все в порядке, пока i = 1 в строке 20. В этот момент для j установлено значение i - 1 = 0, и разница найдена. Однако, когда цикл for возвращается снова, условие завершения j <1 не выполняется, и вместо этого цикл продолжает устанавливать j = -1, и в этот момент он выбрасывает ошибку «за пределами границ», поскольку он явно не может оценивать forceArray. [-1] </p>

Есть идеи? Спасибо

Ответы [ 2 ]

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

Причиной вашей ошибки является изменение переменной внутреннего цикла. Когда i = 1, j = 0 и после выполнения цикла один раз, J уменьшается, и, таким образом, j становится равным 1. Условие j <1 выполняется, так как вы написали j--, измените его на j ++, и у вас все должно быть в порядке , </p>

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

Посмотрите на вашу петлю: for (int j = i - 1; j < 1; j--)

Вы начинаете с j = 0, когда i == 1 и, следовательно, j < 1 в порядке.

Следующая итерация имеет j = -1 (0-1), и, следовательно, вы получите проблему.

Вы хотите использовать вместо этого j >= 0 в качестве условия цикла? Обратите внимание, что вторым параметром является не условие завершения , а условие продолжения , т. Е. До тех пор, пока выполняется это условие, цикл будет выполняться.

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