【问题标题】:How to remove and add element from java array如何从java数组中删除和添加元素
【发布时间】:2026-02-03 03:40:02
【问题描述】:

我有一个 java 数组。我想从数组中删除第一个 d 项目并将其存储到其他数组中。我可以存储但无法删除。我的代码

private static void itemRemove(int[] inputArr, int d) {
        int newArr [] = new int[d];
        for(int i=0;i<d;i++){
            newArr[i] = inputArr[i];
        }

        itemPrint(inputArr); 
        itemPrint(newArr);
    }

所以在示例中假设我有数组 inputArr[1,2,3,4,5] 而我的 d2

我可以添加到newArray [1,2],但无法从inputArr 中删除。

此外,一旦我从大小为 5 的 inputArr 中删除两个元素,我就可以再添加两个元素。任何人都可以提供一些想法如何添加元素。

【问题讨论】:

  • 数组一旦创建,就不能改变它的大小。如果要更改大小,则必须创建一个新数组并使用旧数组的值填充它。
  • Java 中的数组是不可变的。要添加或删除元素,您必须创建一个新数组。您可以将其分配给引用旧数组的变量,但不能将其分配给方法参数...
  • 您可能希望从数组更改为List。另外,在Java 中,数组有一个length 属性,所以不需要传递d。
  • 除了上面的cmets,你还可以使用List来达到你想要得到的结果。

标签: java arrays


【解决方案1】:

您需要创建一个大小为inputArr.length - d 的新int[]array 并复制值:

private static int[] itemRemove(int[] inputArr, int d) {
    int[] newArrd = new int[d];
    int[] newArr = new int[inputArr.length-d];

    int newArrIdx = 0;
    for(int i=0;i<inputArr.length;i++){
        if(i<d){
           newArrd[i] = inputArr[i];
        }else{
           newArr[newArrIdx++] = inputArr[i];
        }
    }

    return newArr;
}

【讨论】:

    【解决方案2】:

    您可以使用 System.arrayCopy 和 Arrays.fill 函数来做到这一点

        int[] inputArr = {1,2,3,4,5};
        int n = 3; //number of positions to move
        int[] newArray = new int[n];//creating new array of size n
        System.arraycopy(inputArr, 0, newArray, 0, n);//copying elements up to nth position to new array
        System.arraycopy(inputArr, n, inputArr, 0, inputArr.length-n);//copying remaining elements to start position
        Arrays.fill(inputArr, inputArr.length-n, inputArr.length, 0);//filling cells after the last element with default 0 value
    
        itemPrint(newArray);
        itemPrint(inputArr);
    

    【讨论】:

      【解决方案3】:

      要从 Array 中删除元素,您还需要删除该元素的现有索引。

      由于 java 中的数组是不可变的,因此您需要像使用 newArr[index] 所做的那样将数组值重新分配给新数组

      只是为了在不改变索引的情况下删除数组元素,您可以使用 commons.apache.org 的预定义库,如下所示:

      array = ArrayUtils.removeElement(array, element)
      

      Apache Common

      或者,您可以使用 arraylist 而不是这个来动态调整数组大小。您可以像这样初始化输入数组:

      ArrayList<> inputArr= new ArrayList<>();
      

      要从 inputArr 中删除具有索引位置的元素,只需使用 list 的 remove(int index) 方法。

      inputArr.remove(your index here);
      

      【讨论】:

        【解决方案4】:

        您没有在此处进行任何删除:

        for(int i=0;i<d;i++){
            newArr[i] = inputArr[i];
        }
        

        您只需将输入数组中的值复制到新数组中。输入数组不变。

        Java 中的数组具有固定大小,因此无法删除元素。您可以近似的典型方法是用一些标记(或“哨兵”)值替换元素。对于对象,这可能是null。对于原始值,例如整数,您可能只需要任意选择一个值:

        for(int i = 0; i < d; i++) {
            newArr[i] = inputArr[i];
            inputArr[i] = -999; //marked for removal
        }
        

        这显然不是一个很好的解决方案。如果 -999 已经在数组中怎么办?

        处理这个问题的正确方法是使用ListLists 不是固定大小的,因此可以删除元素。您可以使用多种实现。 ArrayList 最接近数组。

        您的函数已更改为使用ArrayList,可能如下所示:

        private static void itemRemove(List<Integer> inputArr, int d) {
            List<Integer> newArr = new ArrayList<>();
        
            int removed = 0;
            while (removed < d)
            {
                newArr.add(inputArr.remove(0));
                removed++;
            }
        
            itemPrint(inputArr);
            itemPrint(newArr);
        }
        

        这里发生了一些不同的事情。最值得注意的是,我们有一个int[],现在我们有一个List&lt;Integer&gt;。我们正在使用所谓的“泛型”和generics don't work with primitive types,所以我们需要使用所谓的the "boxed type"

        另一个明显的变化是循环不同。有困难removing from collections while you are iterating over them,我用不同的方式构造了循环以避免这个问题。

        【讨论】:

          【解决方案5】:

          你可以这样做:

          public class Test {
          
              public static void main(String[] args) {
                  int[] array = {1,2,3,4,5,6};
          
                  System.out.println("Original Array");
                  itemPrint(array);
          
                  itemRemove(array, 2);
          
                  array = itemsLeft(array,2);
                  System.out.println("Original Array After Removing Items");
                  itemPrint(array); 
              }
          
              private static void itemRemove(int[] inputArr, int d) {
                  int newArr [] = new int[d];
                  for(int i=0;i<d;i++) newArr[i] = inputArr[i];
                  System.out.println("New Array");
                  itemPrint(newArr);
              }
          
              private static void itemPrint(int[] array) {
                  for(Integer  i : array) System.out.println(i);
              }
          
              private static int[] itemsLeft(int[] inputArr, int d) {
                  int [] itemsLeftArr =  new int[inputArr.length-d];
                  for(int i=d, j=0; i<inputArr.length; i++, j++) {
                      itemsLeftArr[j] = inputArr[i];
                  }
                  return itemsLeftArr;
              }
          
          }
          

          输出:

          Original Array
          1
          2
          3
          4
          5
          6
          New Array
          1
          2
          Original Array After Removing Items
          3
          4
          5
          6
          

          【讨论】:

            【解决方案6】:

            元素不能从数组中删除。您唯一能做的就是复制其他元素以覆盖它们。所以,如果你的数组看起来像这样:

            1 2 3 4 5

            您可以向下复制 3、4 和 5 以覆盖 1 和 2,因此您将得到以下内容:

            3 4 5 4 5

            (注意 4 和 5 仍然存在)

            然后你可以用你想要存储在数组中的新元素覆盖最后两个元素,这样你就可以得到:

            3 4 5 6 7

            要复制元素,您可以使用for 循环手动完成,也可以使用System.arrayCopy()

            【讨论】:

            • 在数组中向上移动元素的同时,您还可以在变量中保持最后一个元素的位置向上移动,例如从这个位置开始,可以覆盖 wards 数组值。