代码之家  ›  专栏  ›  技术社区  ›  user225269

如何正确删除Java数组中的元素

  •  1
  • user225269  · 技术社区  · 14 年前

    我有一个简单的程序,可以通过将记录存储在数组中来添加、编辑、列出、搜索和删除记录。

    我现在的问题是如何正确删除上面的项目。这是我的当前代码。

    System.out.print("Input number to delete: ");
                        delnum=scanz.nextLine();
                        intdelnum=Integer.parseInt(delnum);
    
     name[intdelnum]=null;
                                course[intdelnum]=null;
                                gender[intdelnum]=null;
                                school[intdelnum]=null;
    

    如您所见,如果我列出这个数组,每个数组包含10个元素。我设置为空的数组索引将永远保持为空。我不能在上面加任何东西。 你知道怎么做的更好的方法吗?所以当我删除索引2处的数组元素时。索引3处的元素将向上。索引为2?这样以后我仍然可以在索引中添加一个元素,我将其设置为空。

    4 回复  |  直到 9 年前
        1
  •  1
  •   Covar    14 年前

    我会用 ArrayList 为此。

    它将允许您轻松地从列表中删除项目,并将其后面的每个项目向下移动。

    ArrayList<String> myArrayList;
    
    /*... initialization and filling in of your data ...*/
    
    myArrayList.remove(index);
    

    供充分参考 here 是的1.5.0 API页 数组列表 .

        2
  •  6
  •   Michael Mrozek    14 年前

    您可以通过移动数组内容或使用类似 System.arraycopy ,但您几乎肯定要使用集合。 ArrayList 是可变数组的好选择。 ArrayList.remove 将允许您按索引删除:

    ArrayList<...> name, course, gender, school;
    
    intdelnum = Integer.parseInt(delnum);
    name.remove(intdelnum);
    course.remove(intdelnum);
    gender.remove(intdelnum);
    school.remove(intdelnum);
    

    关于代码段的其他一些随机注释:

    我假设 scanz 是扫描仪。你可以打电话 nextInt() 而不是使用 nextLine() 并将字符串转换为int。

    您可能还希望创建一个包含所有这些信息的类,而不是使用四个并行数组来跟踪它:

    class Student {
        enum Gender {MALE, FEMALE}
    
        private String name;
        private Course course; // This can be a String if that's simpler for your project
        private Gender gender;
        private School school; // See note for 'course'
    }
    
    ArrayList<Student> students;
    
        3
  •  1
  •   Michael Mrozek    14 年前

    创建数组后不能调整其大小。
    您可以从数组创建一个列表,如下所示 Arrays.asList() 使用 remove() 删除不需要的元素,然后使用 toArray() 从列表中获取数组。

        4
  •  1
  •   YoK    14 年前

    您可以编写一个方法(用于删除操作的代码)来移动数组值。

    如果删除了x处的元素,则方法如下:

    private void deleteElement(int del_idx){
        if(del_idx <= org_arr.length ){
            org_arr[del_idx]=null;
            for(int i = del_idx;i < (org_arr.length-1); i++){
                if(org_arr[i+1] != null){
                    org_arr[i] = org_arr[i+1];
                }
            }
        }
    }
    

    但在您的案例中使用arraylist比使用arraylist更合适。