Как обрезать массив целых чисел в Java?

давайте, чтобы у меня было число N. N будет размером массива.

int numArray [] = new numArray[N];

однако содержимое массива будет содержать любое другое число от 1 до положительного N. Это означает, что весь массив размера N не будет заполнен после этого для цикла. Поэтому после цикла for я хочу обрезать (или изменить размер) массива, чтобы в массиве больше не было пустых слотов.

пример :

допустим, N = 5; Это означает, что после цикла for, любой другой число от 1 до 5 будет в массиве следующим образом:

int arr[] = новый int[N];

int arr[0]=1;
int arr[1]=3;
int arr[2]= null;
int arr[3]= null;
int arr[4]= null;

Теперь я хочу обрезать (или изменить размер) после цикла for, чтобы индексы, содержащие null, исчезли, а затем массив должен быть:

int arr[0]=1;
int arr[1]=3;

размер массива теперь равен 2.

4 ответов


вы не можете изменить размер массива в Java после его создания. Однако вы можете создать новый массив нужного вам размера.

еще один важный момент заключается в том, что вы создаете массив первобытное: int. Примитивы не являются объектами, и вы не можете присвоить значение null к примитивному. Вам нужно создать массив java.lang.Integer если вы хотите иметь возможность устанавливать записи в нем в null.

Integer[] numArray = new Integer[N];

вот для функции Java под названием авто-бокс почти весь код, который работает с примитивными int значения, также работает с Integer значения.

действия:

  1. использовать Integer[] вместо int[]
  2. вычислить размер, который вам нужен (count non -null записей в исходном массиве)
  3. выделите новый массив размера, который вам нужен
  4. цикл над старым массивом и копирование каждого не -null значение на новое матрица.

код:

Integer[] oldArray = ...;

// Step 2
int count = 0;
for (Integer i : oldArray) {
    if (i != null) {
        count++;
    }
}

// Step 3
Integer[] newArray = new Integer[count];

// Step 4
int index = 0;
for (Integer i : oldArray) {
    if (i != null) {
        newArray[index++] = i;
    }
}

вы не можете обрезать массив. Самый быстрый подход-просто скопировать его в меньший, используя систему.arraycopy, который почти всегда намного быстрее, чем цикл for:

int somesize = 5;
int[] numArray = new int[somesize];
//code to populate every other int into the array.
int[] smallerArray = new int[somesize/2];
//copy array into smaller version
System.arraycopy(numArray, 0, smallerArray, 0, somesize / 2);

вы, конечно, лучше с какой-то более подходящей структурой данных, например, список или набор в зависимости от того, что ваше намерение с ним позже. Таким образом, вам даже не нужно создавать структуру размера N, чтобы вам все равно пришлось ее уменьшить. Скорее вы создаете пустой список и добавляете элементы, которые вам действительно нужны


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

вы можете сделать:

int someIndex = Arrays.asList(arr).indexOf(null);
arr = Arrays.copyOfRange(arr,0,someIndex);