Сжать массив, удалив из него все элементы, находящиеся в диапазоне [a,b] и заполнить освободившееся элементы нулями. JAVA

public class DeleteArray {

    public static void main(String[] args) {
        Random rand = new Random();
        Scanner scan = new Scanner(System.in);
        System.out.println("Введите размер массива - ");
        int x = scan.nextInt();
        int []  arr = new int[x];
        int [] arr1 = null;
        System.out.println("Введите значение a - ");
        int a = scan.nextInt();
        System.out.println("Введите значение b - ");
        int b = scan.nextInt();
        for (int i = 0;i< arr.length;i++) {
            arr[i] = rand.nextInt(10)+5;
        }
        System.out.println("" + Arrays.toString(arr));
        for (int i = 0; i < arr.length; i++) {
            if (i>=a && i<=b) {
                arr[i] = arr[i+1];
                arr[i] = 0;
            }
        }
        System.out.println("" + Arrays.toString(arr));
    }
}

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

Автор решения: MBo

Вот смотрите (тест на ideone) (исправил скопированную из вопроса ошибку)

int a = 4;
    int b = 6;
    int[] arr = {5,7,0,1,2,8,4};
    int abcount = 0;
    for (int i = 0; i < arr.length; i++) {
      if (arr[i]>=a && arr[i]<=b) //этот элемент не нужен, с ним ничего делать не нужно
          abcount++; 
      else 
         arr[i-abcount] = arr[i];  //а нужный ставим на финальную позицию
    }
    
    for (int i = arr.length - abcount; i < arr.length; i++)
       arr[i] = 0;
       
     System.out.println("" + Arrays.toString(arr));  

    >>[7, 0, 1, 2, 8, 0, 0]
→ Ссылка
Автор решения: Alex Rudenko

В исходном коде на принадлежность диапазону надо проверять значения в массиве, а не его индексы.

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

int j = 0;
for (int i = 0; i < arr.length; i++) {
    if (arr[i] < a || arr[i] > b) { // инвертировать условие
        arr[j++] = arr[i]; // перенести число, не входящее в исключаемый диапазон
    }
}
while (j < arr.length) {
    arr[j++] = 0;
}
System.out.println(Arrays.toString(arr));

результат для a = 7, b = 10;

[0, 9, 9, 10, 10, 11, 0, 11, 6, 8, 12, 10, 6, 7, 11, 6]
[0, 11, 0, 11, 6, 12, 6, 11, 6, 0, 0, 0, 0, 0, 0, 0]
→ Ссылка
Автор решения: xerx593

Попробуйте так (встроил комментарии):

package demo;

import java.io.PrintStream;
import java.nio.charset.StandardCharsets;
import java.util.Random;
import java.util.Scanner;

public class DeleteArray {

  static final int N = 10;

  public static void main(String[] args) {
    Random rand = new Random();
    Scanner scan = new Scanner(System.in);
    // вывод в UTF-8:
    PrintStream ps = new PrintStream(System.out, false, StandardCharsets.UTF_8);
    ps.println("Границы массива:");
    int low = scan.nextInt();
    int high = scan.nextInt();
    assert (low != high); // проверка параметров!!
    if (low > high) { // <- для "чайников"
      int tmp = low;
      low = high;
      high = tmp;
    }
    // генерируем "массив":
    int[] arr = new int[N];
    for (int i = 0; i < arr.length; i++) {
      // arr(i) := случайное число в [low - high]
      arr[i] = rand.nextInt(high - low) + low;
      // ... и вывод:
      ps.format("%d ", arr[i]);
    }
    ps.println();

    ps.println("Удалить элементы в интервале:");
    low = scan.nextInt();
    high = scan.nextInt();
    // тоже самое:
    if (low > high) { // <- для "чайников"
      int tmp = low;
      low = high;
      high = tmp;
    }
    // инициализация:
    int m = N; // "размерность массива", изначально: N
    int i = 0; // "курсор"
    while (i < m) {// В цикле перебираем элементы массива, начиная с первого.
      if (arr[i] <= high && arr[i] >= low) {  // При обнаружении элемента, принадлежащего удаляемому интервалу:
        // размерность массива уменьшаем на единицу:
        m--;
        // остальную (правую) часть массива сдвигаем на одну ячейку в лево
        for (int j = i; j < m; j++) {
          arr[j] = arr[j + 1];
        }
      } else { // При "не-обнаружении", просто двигаем курсор:
        i++;
      }
    }
    // следует заполнить конец массива нулями от элемента с индексом на единицу больше новой размерности массива до количества элементов в «старом» массиве:
    for (i = m; i < N; i++) {
      arr[i] = 0;
    }
    // вывод:
    for (i = 0; i < N; i++) {
      ps.format("%d ", arr[i]);
    }
    ps.println();
    // 
  }
}

Даст, например:

Границы массива:
-10
10
-4 -2 -4 9 -1 -10 3 -10 1 0
Удалить элементы в интервале:
-3
3
-4 -4 9 -10 -10 0 0 0 0 0

ideone

→ Ссылка