Печать методом массива почти правильная, отключено только одно значение, поэтому я не знаю, почему - PullRequest
0 голосов
/ 12 апреля 2019

Итак, я пытаюсь получить массив для передачи в отдельный метод, а затем вернуть массив нового размера, но программа имеет только одно неверное значение. Например, у меня есть массив

int [] myInches = {89,12,33,7,72,42,76,49,69,85,61,23};

что я пытаюсь передать в мой метод createLowerArray

 public static int [] createLowerArray(int maxParam, int [] myInchesParam) {
    int [] betterInches = {0,0,0,0,0,0,0,0,0,0};
    int count = 0;
    for (int i = 0; i < myInchesParam.length; i++) {
        if (myInchesParam[i] < maxParam) {
            count++;
        }
        betterInches = new int [count];
        int newCount = 0;
        for (int q = 0; q < betterInches.length; q++) {
            if (myInchesParam[newCount] < maxParam) {
                betterInches[q] = myInchesParam[newCount];
            }
            newCount++;
        }
    }
    return betterInches;
}

С maxParam просто быть тем, что вводит пользователь. Допустим, они вставили 40, второй метод увидит, что только 4 элемента (12,33,7 и 23) меньше 40 и создаст массив длиной 4 с позицией 0, равной 12, [1] = 33 , [2] = 7 и [3] = 23, но по какой-то причине моя программа делает это так. Позиция 0 в новом массиве равна 0, [1] = 12, [2] = 33 и [3] = 7. Длина верна, но значения не в правильных позициях. Я получил помощь с этим раньше и думал, что у меня есть это, плохо возвращаться так быстро, но я просто не могу понять это. Спасибо всем, кто помогает. Я знаю, что это можно сделать проще с помощью списков, потоков и тому подобного, но мне нужна практика с циклами.

Ожидаемый результат должен быть

int length = 4
[0] = 12
[1] = 33
[2] = 7
[3] = 23

Токовый выход

int length = 4
[0] = 0
[1] = 12
[2] = 33
[3] = 7

Ответы [ 3 ]

1 голос
/ 12 апреля 2019

Непосредственная проблема здесь:

    for (int q = 0; q < betterInches.length; q++) {
        if (myInchesParam[newCount] < maxParam) {
            betterInches[q] = myInchesParam[newCount];
        }
        newCount++;
    }

Вы всегда увеличиваете newCount, даже если вы не скопировали значение. Кроме того, вам нужно перебрать myInchesParam, а не betterInches:

    for (int j = 0, q = 0; j < myInchesParam.length; j++) {
        if (myInchesParam[j] < maxParam) {
            betterInches[q] = myInchesParam[j];
            q++;
        }
    }

Кроме того, вы выполняете намного больше работы, чем необходимо - ваш текущий код является квадратичным по размеру входного массива. Вы создаете новый массив betterInches на каждой итерации внешнего цикла, а затем отбрасываете его и снова создаете на следующей итерации.

Переместить внутренний цикл из внешнего цикла:

for (int i = 0; i < myInchesParam.length; i++) {
    if (myInchesParam[i] < maxParam) {
        count++;
    }
}

betterInches = new int [count];
for (int i = 0, q = 0; i < myInchesParam.length; i++) {
    if (myInchesParam[i] < maxParam) {
        betterInches[q++] = myInchesParam[i];
    }
}
0 голосов
/ 12 апреля 2019

Попробуйте это

for (int q = 0; q < betterInches.length; q++) {
        if (myInchesParam[q] < maxParam) {
            betterInches[newCount] = myInchesParam[q];
            newCount++;
           }      
    }
0 голосов
/ 12 апреля 2019

Обновлено

На самом деле вы не перебираете весь массив для получения ваших параметров. изменил второй цикл на это.

 int newCount = 0;
 for (int q = 0; q < myInchesParam.length; q++) {
     if (myInchesParam[q] < maxParam) {
         betterInches[newCount] = myInchesParam[q];
         newCount++;
     }

 }

Разделить первый цикл и второй цикл. Ваш второй цикл находится внутри первого цикла. взгляните на код ниже.

public static int [] createLowerArray(int maxParam, int [] myInchesParam) {
    int [] betterInches = {0,0,0,0,0,0,0,0,0,0};// Dont need to initialize
    int count = 0;
    for (int i = 0; i < myInchesParam.length; i++) {
        if (myInchesParam[i] < maxParam) {
            count++;
        }
    } // First loop end here

    betterInches = new int [count];
    int newCount = 0;
    for (int q = 0; q < myInchesParam.length; q++) {
       if (myInchesParam[q] < maxParam) {
          betterInches[newCount] = myInchesParam[q];
          newCount++;
       }

    } // Second Loop ends heer

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