在Java中从数组中删除项目

时间:2010-05-14 07:10:54

标签: java arrays algorithm

这里有什么问题?我想从数组中删除一个项目,但它显示了我

  

错误ArrayIndexOutBound异常

public class delete {

    public static void main(String[]args) {
        int i;

        //delete  item from array
        int k[] = new int[]{77,99,44,11,00,55,66,33,10};

        //delete 55
        int searchkey=55;

        int nums=k.length;
        for ( i=0;i<nums;i++)
            if (k[i]==searchkey)
                break;

        for (int t=i;t<nums;t++)
            k[t]=k[t+1];
        nums--;

        for (int m=0;m<nums;m++) {
            System.out.println(k[m]);
        }
    }
}

8 个答案:

答案 0 :(得分:5)

for (int t=i;t<nums-1;t++)  //Should be -1 here, as k[t+1] will be out of bounds if t = nums-1

或移动数字

之前的nums--的另一个变体
nums--;
for (int t=i;t<nums;t++)
   k[t]=k[t+1];

答案 1 :(得分:3)

以下重写应具有指导意义:

public class Delete {
    static int search(int key, int[] arr) {
        for (int i = 0; i < arr.length; i++)
            if (arr[i] == key) {
                return i;
            }
        return -1;
    }
    static void print(int[] arr, final int L) {
        for (int i = 0; i < L; i++) {
            System.out.println(arr[i]);
            // try this also:
            // System.out.format("%02d ", arr[i]);          
        }
    }
    public static void main(String[] args) {
        int nums[] = { 77, 99, 44, 11, 00, 55, 66, 33, 10 };
        final int N = nums.length;
        int searchKey = 55;

        int pos = search(searchKey, nums);
        for (int t = pos; t < N-1; t++) {
            nums[t] = nums[t + 1];
        }
        print(nums, N-1);
        // prints 77, 99, 44, 11, 0, 66, 33, 10
        System.out.println(010 == 8); // prints "true"
        System.out.println(00000); // prints "0
    }
}

以下是一些重要的观察结果:

  • 将逻辑拆分为辅助方法。这使得逻辑组件更易于测试和重用,并且整体逻辑更易于理解。
  • 如果您使用final这样的N局部变量来表示int[] nums的初始大小,并使用{N来定义逻辑的其余部分,则会使代码更易于理解1}},N-1
    • final变量越多,越了解它们的价值随时间变化的情况
  • 关注coding convention。特别是,类名以大写字母开头。
  • 请小心数组中的000前缀用于八进制文字。也就是010 == 8
  • 请注意00打印为简单0。在数字上,00 = 000 = 0000 = 0。如果您需要将其填充为零,那么这就是格式化问题。

另见

八进制文字

零填充

答案 2 :(得分:1)

在以下循环中

for (int t=i;t<nums;t++)
   k[t]=k[t+1];

当t指向最后一个元素时,k [t + 1]操作将抛出异常,这就是你现在所得到的。

答案 3 :(得分:0)

k[t]=k[t+1];上,您有错误es k[t+1]尝试访问索引为9的第10个元素,但您的数组包含9个元素。所以你得到的数据不受限制。

答案 4 :(得分:0)

如果您使用它,Draco Ater说:

for (int t=i;t<nums-1;t++) {
    k[t]=k[t+1];
}
nums--;

输出是: 77 99 44 11 0 66 33 10

哪个应该是正确的。 ; - )

答案 5 :(得分:0)

    for (int t=i;t<nums;t++)
      k[t]=k[t+1];

只需用nums-1替换nums,因为你已经删除(跳过)了一个元素。

答案 6 :(得分:0)

我发现它以下列方式效果最佳:

确保迭代不会超出倒数第二个元素(array.length-1),因此它可以有一个要比较的元素:

for(int i=elementPosition-1;i<array.length-1;i++){array[i]=array[i+1];}

答案 7 :(得分:0)

import java.util.ArrayList;
import java.util.Arrays;

public class Sort {
    public static void main(String a[]) {
        int swap;
        int length;
        int[] unsorted = { 1, 2, 4, 3, 6, 5, 7, 8, 18, 17, 65, 46, 2, 4, 5, 3,
                4 };
        length = unsorted.length;
        for (int i = 0; i < length; i++) {
            for (int j = i + 1; j < length; j++) {
                if (unsorted[i] > unsorted[j]) {
                    swap = unsorted[i];
                    unsorted[i] = unsorted[j];
                    unsorted[j] = swap;
                } else if (unsorted[i] == unsorted[j]) {
                    for (int k = j; k < length - 1; k++) {
                        unsorted[k] = unsorted[k + 1];
                    }
                    length -= 1;
                }
            }
        }
        for (int i = 0; i < length; i++) {
            System.out.println(" " + i + "th element " + unsorted[i]);
        }
    }
}