Сдвиг значений для очистки нулевых пробелов в массиве

1

У меня есть массив, и у меня есть метод, который позволяет удалять элементы в массиве. Поэтому мы могли бы удалить все, что находится в индексе 5 массива. Индекс 5 будет оставлен как null, что вызовет проблему. Я стараюсь иметь возможность смещать все значения влево, а затем удалять это свободное пространство, чтобы он соответствовал правильному размеру массива. Значит, у нас не будет никаких нулевых значений в массиве.

Моя попытка:

  for (int j = 0; j< myArray.length; j++){
        if (myArray[j] == null){
            myArray[j] =MyArray[j+1];
            break;
        }
    }

Это не работает по очевидным причинам. Я знаю, где я ошибаюсь. Я заменяю нулевое значение, каково бы ни было следующее значение в массиве. Поэтому мне присваиваются два значения в массиве рядом друг с другом. Это, очевидно, не то, что я хочу. Но я не могу понять, как это сделать. Мне сказали, что я недостаточно перебираю массив. Любые предложения/советы?

благодаря

  • 0
    я думаю, что вы получаете исключение arrayindexoutofbounds при попытке изменить элемент myArray [myArray.length - 1] = Myarray [myarray.length]
  • 1
    Вы не можете изменить размер массива, точка. Вам нужно полностью создать новый массив и скопировать все элементы из старого массива, если вы хотите, чтобы он был другого размера.
Показать ещё 3 комментария
Теги:
arrays

4 ответа

1

Одно простое решение, которое приходит мне на ум, - это сначала запустить массив, указав, сколько "пустых" слотов есть.

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

Тогда это просто вопрос копирования ненулевых элементов из первого массива во второй массив.

Что-то вроде этого:

public <T> T[] trimArray(T[] array) {
    int count = 0;
    for (int i = 0; i < array.length; i++) {
        if (array[i] == null) continue;
        count++;
    }

    int j = 0;
    T[] newArray = new T[count];
    for (int i = 0; i < array.length; i++) {
        if (array[i] == null) continue;
        newArray[j++] = array[i];
    }

    return newArray;
}

Время работы в O (N).

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

1

Сначала подсчитайте количество ненулевых элементов в массиве:

int numOfElements = 0;
for (int i=0; i<myArray.length; i++)
    if (myArray[i] != null)
        numOfElements++;

Затем выделите новый (возможно, меньший) массив:

Type[] myNewArray = new Type[numOfElements];
// Replace 'Type' with the type of your array

Наконец, скопируйте все ненулевые элементы в новый массив:

for (int i=0,j=0; i<myArray.length; i++)
    if (myArray[i] != null)
        myNewArray[j++] = myArray[i];

Если необходимо, то в этот момент вы можете установить myArray = myNewArray.

1
int iTo = 0:
for (int iFrom = 0; iFrom < myArray.length; ++iFrom) {
    if (myArray[iFrom] != null) {
        myArray[iTo] = myArray[iFrom];
        ++iTo;
    }
}

Далее следует

for (int i = iTo; i < myArray.length: ++i) {
    myArray[i] = null;
}

такой же как

Arrays.fill(myArray, iTo, myArray.length, null);

или сократите массив

myArray = Arrays.copyOf(myCopy, iTo);
  • 0
    Можем ли мы использовать iTo++ и iFrom++ вместо предварительного инкремента?
  • 1
    Да, просто моя личная черта; i ++ возвращает старое значение i, а затем увеличивает i, что является более трудоемким в машинном коде, чем ++ i, которое просто увеличивает i и выдает новое значение. На практике здесь нет никакой разницы.
1
public int[] deleteMember (int index, int[] array) {
    int[] newArray;
    int length = array.length;
    if (index < length) {
        newArray = new int[length-1];
        int i=0;
        for (int j=0; j<length; j++) {
            if (j != index) {
                newArray[i] = array[j];
                ++i;
            }
        }
    } else {
        // Illegal index; handle accordingly
        newArray = array;
    }
    return newArray;
}

Применение:

int[] testArray = {1, 2, 3, 4, 5};
testArray  = deleteMember(1,testArray);   // testArray  = {1, 3, 4, 5}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню