У меня есть массив, и у меня есть метод, который позволяет удалять элементы в массиве. Поэтому мы могли бы удалить все, что находится в индексе 5 массива. Индекс 5 будет оставлен как null, что вызовет проблему. Я стараюсь иметь возможность смещать все значения влево, а затем удалять это свободное пространство, чтобы он соответствовал правильному размеру массива. Значит, у нас не будет никаких нулевых значений в массиве.
Моя попытка:
for (int j = 0; j< myArray.length; j++){
if (myArray[j] == null){
myArray[j] =MyArray[j+1];
break;
}
}
Это не работает по очевидным причинам. Я знаю, где я ошибаюсь. Я заменяю нулевое значение, каково бы ни было следующее значение в массиве. Поэтому мне присваиваются два значения в массиве рядом друг с другом. Это, очевидно, не то, что я хочу. Но я не могу понять, как это сделать. Мне сказали, что я недостаточно перебираю массив. Любые предложения/советы?
благодаря
Одно простое решение, которое приходит мне на ум, - это сначала запустить массив, указав, сколько "пустых" слотов есть.
Затем вы создаете второй массив с длиной первого массива минус количество пустых слотов, которые вы рассчитали в первом прогоне.
Тогда это просто вопрос копирования ненулевых элементов из первого массива во второй массив.
Что-то вроде этого:
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).
Обратите внимание, что нет другого способа, кроме создания нового массива, если вы хотите "изменить" размер входного массива, так как массив будет отсортирован по размеру.
Сначала подсчитайте количество ненулевых элементов в массиве:
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
.
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);
iTo++
и iFrom++
вместо предварительного инкремента?
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}