Как обрезать массив целых чисел в 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
значения.
действия:
- использовать
Integer[]
вместоint[]
- вычислить размер, который вам нужен (count non -
null
записей в исходном массиве) - выделите новый массив размера, который вам нужен
- цикл над старым массивом и копирование каждого не -
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);