【问题标题】:problem deleting elements in arraylist删除arraylist中的元素的问题
【发布时间】:2010-08-01 10:49:46
【问题描述】:

我正在使用arraylist 做一个简单的程序。但是我遇到了一个错误。 删除arraylist中的元素后,使用以下代码:

delnum=scanz.nextLine();
intdelnum=Integer.parseInt(delnum);

nem.remove(intdelnum);
corz.remove(intdelnum);
skul.remove(intdelnum);
gen.remove(intdelnum);

我在删除后添加另一条记录时遇到问题。据我所知,我存储下一个元素的索引大于大小,因为我删除了一个项目。

do {
    System.out.println("Add Records");

    System.out.print("Name: ");
    nem.add(ctr, scanz.nextLine());

    System.out.print("Course: ");
    corz.add(ctr, scanz.nextLine());

    System.out.print("Gender: ");
    gen.add(ctr, scanz.nextLine());

    System.out.print("School: ");
    skul.add(ctr, scanz.nextLine());

    System.out.println("Another?\n1.Yes\n2.No");
    adds=scanz.nextLine();
    addagain=Integer.parseInt(adds);

    ctr++;
} while(addagain==1);

我收到此错误:

Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 4, Size: 3

请帮忙,

【问题讨论】:

    标签: java arraylist


    【解决方案1】:

    怎么样

     ctr--;
    

    删除?

    【讨论】:

      【解决方案2】:

      您应该只使用add(object) 而不是add(index, object) - 这样您就不会遇到上面遇到的问题。

      【讨论】:

        【解决方案3】:

        在您的情况下,您不需要在添加 ArrayList 时维护索引。 我认为在您的情况下,您需要它,因为您将学生信息保存在多个 ArrayList 中,例如 nem 数组列表中的名称、corz 数组列表中的课程等。然后你用它来进行关联。我认为这不是很好的设计。

        好的设计应该是创建包含名称、课程、地址等详细信息的 Student 对象,然后将 Student 对象添加到 Arraylist。

        public class Student {
            private String name;
            private String course;
            private String gender;
            private String school;
        
            public String getName() {
                return name;
            }
            public void setName(String name) {
                this.name = name;
            }
            public String getCourse() {
                return course;
            }
            public void setCourse(String course) {
                this.course = course;
            }
            public String getGender() {
                return gender;
            }
            public void setGender(String gender) {
                this.gender = gender;
            }
            public String getSchool() {
                return school;
            }
            public void setSchool(String school) {
                this.school = school;
            }
        
        }
        

        那么你的代码会变成:

            do {
                Student student = new Student();
                System.out.println("Add Records");
        
                System.out.print("Name: ");
                student.setName(scanz.nextLine());
        
                System.out.print("Course: ");
                student.setCourse(scanz.nextLine());
        
                System.out.print("Gender: ");
                student.setGender(scanz.nextLine());
        
                System.out.print("School: ");
                student.setSchool(scanz.nextLine());
        
                // Add student to students ArrayList
                students.add(student);
        
                System.out.println("Another?\n1.Yes\n2.No");
                adds = scanz.nextLine();
                addagain = Integer.parseInt(adds);
            } while (addagain == 1);
        

        希望这有帮助。

        【讨论】:

          【解决方案4】:

          正如我所见,每次插入项目后,Ctr 都会增加。但删除后不会减少。因此,下次当您向这些列表添加项目时,由 ctr 表示的索引在列表中不存在。这就是你得到 IndexOutOfBoundException 的原因。

          通过使用 ctr-- 删除,正如“鸭子”所说,解决了您现有的问题。但是“Will A”的方法简化了代码。正如 Osccam's Razor 建议的那样,我喜欢使用“Will A”的答案

          【讨论】:

            猜你喜欢
            • 2013-02-24
            • 2018-04-07
            • 2014-08-28
            • 2012-04-25
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多