Удалить элемент из массива и заменить на 0?

#java #arrays #for-loop

Вопрос:

public static void remove (int[] arr, int toRemove)
«Это должно удалить значение ToRemove из массива. Остальные элементы должны быть просто сдвинуты в сторону начала массива. (Размер массива не изменится). Поскольку теперь в массиве будет использоваться на один элемент меньше, исходный последний элемент следует просто заменить на 0. Если в массиве имеется более одного вхождения ToRemove, следует удалить только ПЕРВОЕ вхождение. Если в массиве нет элементов, это просто не должно иметь никакого эффекта».

До сих пор у меня есть это:

 public static void remove(int[] arr, int toRemove) {
    for(int i = 0; i <= arr.length - 1; i  ) {
        if(arr[i] == toRemove) {
            arr[i] = arr[i   1];
            arr[toRemove] = 0;
        }
    }
}
 

У меня есть основной метод с массивом с его содержимым: [3, 5, 7, 8, 12, 2] и сообщением о вызове remove(array, 5) . Однако мой массив распечатывается [3, 7, 7, 8, 12, 0] , когда он должен быть распечатан [3, 7, 8, 12, 2, 0] .

Может ли кто-нибудь сообщить мне, в чем я ошибся, и объяснить это?

Комментарии:

1. Таким образом, ваш код обнаруживает, что arr[1] равен 5, устанавливает его в arr[2], что равно 7, а затем по какой-то причине вы устанавливаете arr[5] равным нулю. Вы не сдвигаете ни один из других элементов.

2. Две вещи — вы заменяете индекс любого toRemove элемента на 0, вместо фактического последнего элемента, поэтому в вашем случае вы удаляете arr[5] (что в данном случае случайно оказывается последним элементом), и вы не учитываете несколько вхождений toRemove .

3. Пошаговое выполнение кода с помощью отладчика

4. @ManishGiri Я должен удалить только первое вхождение, а затем программа завершится. И поскольку это цикл, не означает ли это, что он установит все текущие индексы на следующие индексы (i 1), сдвинутые влево? Я полагаю, что я все еще не понимаю, как переместить все остальные элементы.

5. Что делать, если у вас во много раз больше значения toRemove в массиве?

Ответ №1:

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

 import java.util.Arrays;
public class main
{
    // tip: arguments are passed via the field below this editor
    public static void main(String[] args)
    {
        int[] arr = {3, 5, 7, 8, 5, 12, 2};
        remove(arr, 5);
        System.out.println(Arrays.toString(arr)); // [3, 7, 8, 5, 12, 2, 0]
    }

    public static void remove(int[] arr, int toRemove) {
        int idx = -1;
        // determine first occurrence of toRemove
        for(int i = 0; i < arr.length; i  ) {
            if(arr[i] == toRemove) {
                idx = i;
                break;
            }
        }
        // if not found, return
        if(idx == -1) return;
        // shift other elements down
        for(int i = idx; i < arr.length-1; i  ) {
            arr[i] = arr[i 1];
        }
        // set last element to 0
        arr[arr.length-1] = 0;
    }
}
 

Комментарии:

1. могли бы мы пообщаться? Я знаю, что не имею права спрашивать, но я действительно хочу быть хорошим программистом, но есть некоторые вещи, которые мне трудно понять. Мне нужно, чтобы мне элементарно объяснили понятия. У меня есть проект по кодированию, в котором мне нужна помощь, если вы готовы помочь коллеге-ученику. Моя электронная почта: nguyen_david1949@yahoo.com. Спасибо вам даже за то, что вы прочитали!

2. @Манаш Гири, я только что написал вам по электронной почте, сэр.

Ответ №2:

Вам нужно иметь два индекса:

fromIndex-это тот, который входит в массив.

toIndex-это место, где должен находиться предмет.

 public static void remove(int[] arr, int toRemove) {
    int toIndex = 0;
    for(int fromIndex = 0; fromIndex < arr.length; fromIndex  ) {
        //paste number only if its not 'toRemove'
        if(arr[fromIndex] != toRemove) {
            arr[toIndex] = arr[fromIndex];
            toIndex  ;
        }
    }

    //Fill the rest with 0
    for (; toIndex < arr.length; toIndex  )
        arr[toIndex] = 0;
}
 

это работает, если существует несколько индексов со значением ToRemove

Ответ №3:

Вы должны использовать System.arraycopy . Это быстро. Попробуй это.

 public static void remove(int[] arr, int toRemove) {
    for(int i = 0, length = arr.length; i < length; i  ) {
        if(arr[i] == toRemove) {
            System.arraycopy(arr, i   1, arr, i, length - i - 1);
            arr[length - 1] = 0;
            break;
        }
    }
}

public static void main(String[] args) throws IOException {
    int[] a0 = {0, 1, 2, 3, 4};
    remove(a0, 0);
    System.out.println(Arrays.toString(a0));
    int[] a4 = {0, 1, 2, 3, 4};
    remove(a4, 4);
    System.out.println(Arrays.toString(a4));
    int[] a5 = {0, 1, 2, 3, 4};
    remove(a5, 5);
    System.out.println(Arrays.toString(a5));
    int[] a6 = {0};
    remove(a6, 0);
    System.out.println(Arrays.toString(a6));
    int[] a7 = {};
    remove(a7, 0);
    System.out.println(Arrays.toString(a7));
}
 

выход:

 [1, 2, 3, 4, 0]
[0, 1, 2, 3, 0]
[0, 1, 2, 3, 4]
[0]
[]