如何在Java中修剪整数数组?

时间:2014-03-23 04:25:31

标签: java arrays

让我有一个数字N.N将是数组的大小。

int numArray [] = new numArray[N];

但是,数组的内容将保持从1到正N的所有其他数字。这意味着在循环之后整个大小的N数组将不会满。因此,在for循环之后,我想修剪(或调整大小)数组,以便数组中不再有任何空插槽。

示例:

假设N = 5; 这意味着,在for循环之后,从1到5的每个其他数字都将在数组中,如下所示:

int arr [] = new 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.

5 个答案:

答案 0 :(得分:9)

您无法修剪数组。最快的方法是使用System.arraycopy将其复制到较小的方法,即almost always much faster than a for loop

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);

答案 1 :(得分:9)

创建后,您无法在Java中更改数组的大小。 但是,您可以创建一个所需大小的新数组。

另一个重要的一点是,您正在创建一个原语的数组:int。基元不是对象,您不能将值null分配给基元。 如果您希望能够将java.lang.Integer中的条目设置为null,则需要创建一个Integer[] numArray = new Integer[N]; 数组。

int

这就是一个名为自动装箱的Java功能,几乎所有使用原始Integer值的代码都适用于Integer[]值。

步骤:

  1. 使用int[]代替null
  2. 计算所需的大小(计算原始数组中的非null条目)
  3. 分配一个所需大小的新数组
  4. 遍历旧数组,并将其中的每个非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; } } 值复制到新数组。
  5. 代码:

    {{1}}

答案 2 :(得分:1)

我认为修剪本身的方法有点短。 剩下的就是找到合适的索引。

你可以这样做:

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

答案 3 :(得分:0)

你肯定会更好地使用一些更合适的数据结构,例如一个列表或一组,具体取决于你以后的意图。这样你甚至不需要创建一个N尺寸的结构,所以你无论如何都要减少它。而是创建一个空列表并添加实际需要的元素

答案 4 :(得分:0)

import java.util.Arrays;  

public static void main( String[] args )
    {
        int[] nums2 = {9,4,1,8,4};

        nums2 =Arrays.copyOf(nums2,3);

        for (int i : nums2) {
            System.out.print(i+" ");
        }


    }

//输出

9 4 1