проблема удаления элементов в массиве - PullRequest
1 голос
/ 01 августа 2010

Я делаю простую программу, используя 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

Пожалуйста, помогите,

Ответы [ 4 ]

4 голосов
/ 01 августа 2010

А как насчет

 ctr--;

при удалении?

2 голосов
/ 01 августа 2010

Вы должны просто использовать add(object) вместо add(index, object) - тогда у вас не возникнет проблем, о которых вы говорили выше.

1 голос
/ 01 августа 2010

В вашем случае вам не нужно поддерживать индекс при добавлении в ArrayList. Я думаю, что в вашем случае вы нуждаетесь в этом, поскольку вы сохраняете информацию о студентах в множественном ArrayList, как имя в nem arraylist, курс в corz arraylist ... и т. Д. И тогда вы используете его для корреляции. Я думаю, что это не очень хороший дизайн.

Хорошим дизайном было бы создание объекта 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);

Надеюсь, это полезно.

0 голосов
/ 01 августа 2010

Как я вижу, Ctr увеличивается после каждой вставки элемента.но не уменьшается после удаления.Итак, в следующий раз, когда вы добавите элемент в эти списки, индекс, представленный ctr, не будет в списке.Это причина для вас, чтобы получить IndexOutOfBoundException.

Использование ctr-- в удалении, как сказал «Duckman», решает существующую проблему.Но подход "Will A" упрощает код.Как предположил Osccam's Razor, мне нравится идти с ответом "Will A"

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...