Вывод элементов массива в заданном диапазоне

Мне нужно вывести новый массив, перебрав старый и выбрать от туда числа которые находятся в между числами int start и int end. Но у меня выдает не то что нужно.

    int[] numbers = {5, 6, 8, 9, 12, 15, 20};
    int start = 8;
    int end = 12;
    int[] nums = new int[end - start - 1];
    for (int i = 0; i < numbers.length; i++) {
        for (int j = 0; j < nums.length; j++) {
            if (numbers[i] >= start && numbers[i] <= end) {
                nums[j] = numbers[i];
            }
        }
    }

Получается массив введите сюда описание изображения

Что я делаю не так?

   for (int i = 0; i < nums.length; i++) {
       if (i == 0) {
           System.out.print("[");
       }
        System.out.print(nums[i]);
       if (i < nums.length - 1) {
           System.out.print(", ");
       } else {
           System.out.print("]");
       }
    }

Ответы (1 шт):

Автор решения: Алексей Шиманский

На самом деле, проблем тут очень много. Но если отвечать на конкретный вопрос: на каждой итерации по основному массиву, запускается ещё один цикл и заносит во все ячейки nums числа этой итерации (при соблюдении условия, конечно же). Так если numbers[i] будет равен 8, то запуститься внутренний цикл и во все ячейки nums положит 8. Потом на другом цикле - все ячейки затрёт девятками и т.д.

Если последней цифрой (или числом), подходящим под условие, поставить, например 11, то будет три раза 11.

Если откинуть все недочёты и некорректности кода, то конкретно эту проблему можно решить убрав цикл и просто добавив свой счётчик и прибавляя его "вручную". Получится что-то типа такого:

int[] nums = new int[end - start - 1];
int numsIndex = 0;

for (int i = 0; i < numbers.length; i++) {        
    if (numbers[i] >= start && numbers[i] <= end) {
        nums[numsIndex] = numbers[i];
        numsIndex++;
    }        
}
→ Ссылка