2010-08-01 14 views
1

arraylist를 사용하여 간단한 프로그램을 만들고 있습니다. 하지만 오류가 발생했습니다. 이 코드를 사용하여 ArrayList에의 요소를 삭제 한 후 :arraylist의 요소 삭제 문제

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

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

나는 삭제 후 다른 레코드를 추가하는 문제에 봉착했습니다. 내가 본 것으로부터, 다음 요소를 저장하고있는 인덱스는 항목을 삭제 한 이후의 크기보다 큽니다. - 당신은 당신이 위의 encoutered 한 문제가되지 않습니다

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

도와주세요,

답변

1

귀하의 경우 ArrayList를 추가하는 동안 색인을 유지할 필요가 없습니다. 당신이 nem arraylist, corz arraylist 코스 등에서 이름과 같은 멀티플 ArrayList에 학생들의 정보를 저장할 때 당신이 필요로 할 때 당신이 그것을 필요로한다고 생각합니다. 그리고 당신은 그것을 공동 작업에 사용합니다. 나는 이것이 아주 좋은 디자인이 아니라고 생각한다.

좋은 디자인은 이름, 코스, 주소 등 세부 정보가있는 학생 개체를 만든 다음 학생 개체를 Arraylist에 추가하는 것이 좋습니다. 이 도움이됩니다

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); 

희망 :

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; 
    } 

} 

그런 다음 코드로 변경됩니다.

2

당신은 단지 add(object)보다는 add(index, object) 사용해야합니다

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); 

나는이 오류가 발생합니다.

4

무엇 삭제에

ctr--; 

어떻습니까?

0

나는 당신이 아이템을 삽입 할 때마다 Ctr이 증가하는 것을 보았습니다. 삭제 후에는 감소하지 않습니다. 따라서 다음에 목록에 항목을 추가하려고하면 ctr로 나타나는 색인이 목록에 없습니다. 이 때문에 IndexOutOfBoundException을 얻을 수 있습니다.

"the Duckman"이 말한 것처럼 ctr-- 삭제를 사용하면 기존 문제를 해결할 수 있습니다. 그러나 "Will A"의 접근 방식은 코드를 단순화합니다. Osccam의 면도날은 "Will A"의 대답을 좋아한다고 제안합니다.