【问题标题】:Delete item from array in Java从Java中的数组中删除项目
【发布时间】:2010-05-14 07:10:54
【问题描述】:

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

错误 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]);
        }
    }
}

【问题讨论】:

  • 请格式化此问题,使其清晰易读并添加语言标签。
  • 请注意,Java 中的数组是固定长度的,你不能真正从数组中删除一个元素(这样数组就会变短一个元素)。
  • 如果不想保留元素的顺序,只需将有问题的元素替换为最后一个元素,并将最后一个元素设置为null即可。

标签: java arrays algorithm


【解决方案1】:
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];

【讨论】:

  • @davit-datuashvili:这应该可以,但只是不要在循环之前添加 nums--。您需要将 nums-- after 循环替换为它之前的循环,它将起作用。
【解决方案2】:

以下重写应该是有指导意义的:

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的初始大小,然后用NN-1来定义其余的逻辑,这会使代码更容易理解,等等
    • final 变量越多,就越难理解它们的值随着时间的推移而发生的变化
  • 关注coding convention。特别是,类名以大写开头。
  • 请注意数组中的000 前缀用于八进制文字。即010 == 8
  • 请注意00 打印为简单的0。从数字上看,00 = 000 = 0000 = 0。如果您需要对其进行零填充,那么这是格式问题。

另见

关于八进制文字

关于零填充

【讨论】:

    【解决方案3】:

    在下面的循环中

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

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

    【讨论】:

    • 谢谢大家,我试过一次但没有成功,可能是因为我没有正确制作可执行文件,我在 linux 文本编辑器中编写程序,可能是因为编译错误
    【解决方案4】:

    k[t]=k[t+1]; 上出现错误,k[t+1] 尝试访问索引为 9 的第 10 个元素,但您的数组包含 9 个元素。所以你的数据越界了。

    【讨论】:

    • 如果只是为了测试需要,可以是 for (int t = i; t
    【解决方案5】:

    如果你像 Draco Ater 所说的那样使用它,它就会起作用:

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

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

    这应该是正确的。 ;-)

    【讨论】:

    • Draco 的建议是在移动数组元素之前减少“nums”,您在此处发布的是交换后的“nums”(OP 已经在这样做)。
    • dracos 回答的第一行:for (int t=i;t
    【解决方案6】:
        for (int t=i;t<nums;t++)
          k[t]=k[t+1];
    

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

    【讨论】:

      【解决方案7】:

      我发现以下方式效果最好:

      确保迭代不超过倒数第二个元素 (array.length-1),以便它可以有一个元素进行比较:

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

      【讨论】:

        【解决方案8】:
        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]);
                }
            }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-10-03
          • 2021-10-19
          • 2014-09-21
          • 2013-06-08
          • 2020-07-01
          • 2019-02-15
          • 2014-05-01
          • 2015-10-25
          相关资源
          最近更新 更多