2010-04-13 4 views
1

다음 코드로 ArrayIndexOutofBounds 예외가 발생합니다. Node nodeJ = vect.get(j)Vector ArrayIndexOutOfBounds

행에서 예외가 발생하지만 j가 i보다 확실히 작고 어떤 예외도 발생시키지 않기 때문에 나에게 이해가되지 않습니다.

어떤 도움을 주시면 감사하겠습니다.

public static Vector join(Vector vect) throws ItemNotFoundException {

Vector<Node> remain = vect; 
    for (int i = 1; i < vect.size(); i++) { 
     Node nodeI = vect.get(i); 
     for (int j = 0; j < i; j++) {//traverse the nodes before nodeI 
      Node nodeJ = vect.get(j); 

      if (nodeI.getChild1().getSeq().equals(nodeJ.getSeq())) { 
       nodeI.removeChild(nodeJ); 
       nodeI.setChild(nodeJ); 
       remain.remove(j); 
      } 
      if (nodeI.getChild2().getSeq().equals(nodeJ.getSeq())) { 
       nodeI.removeChild(nodeJ); 
       nodeI.setChild(nodeJ); 
       remain.remove(j); 
      } 
     } 
    } 
    return remain; 
} 

답변

6

당신은 별칭 참조 remain을 통해, 당신은 이상 반복되는 같은 벡터에서 요소를 제거합니다. 대신 사본을 사용하려는 경우, 당신은해야 당신이 벡터에서 이상 i - j 노드를 제거하여 내부 루프에서하면 어떻게됩니까

Vector<Node> remain = new Vector<Node>(vect); 
+0

아, 감사합니다. – Esmond

4

? 당신은 j > vect.size()으로 끝날 것입니다.

아마도 두 번째 for 루프의 조건을 j < i && j < vect.size()으로 변경하는 것이 가장 좋지만, 반복하는 동안 요소를 제거하기 위해 컬렉션을 두 번 반복하는 알고리즘에 결함이 있다고 생각합니다.

1

반복하는 동안 vect에서 제거하고 있습니다. 네가 그 일을하고 싶다고 확신하니?

이 줄 것을 기억하십시오 :

Vector<Node> remain = vect; 

vect의 복사본을 생성 하지 않습니다. remain에서 뭔가를 제거하면 두 개의 이름이 같은 실제 개체를 참조하기 때문에 vect에서도 제거됩니다.

+0

아, 알았어, 나는 그대로 vect을 떠나면서 남아있는 물건을 제거하고 싶다. 그래서 내가해야 할 것 같아 벡터 newVect = vect.clone(); 다음은 remaining = newVect; 이 맞나요? – Esmond

+0

필자는 가능한 한'clone()'을 사용하지 말고, 특히 모든 내장 된'Collection' 클래스는 다른'Collection' 클래스로부터 새로운 인스턴스를 생성하기위한 복사 생성자를 가지고 있기 때문에 계속 사용하지 않을 것입니다. Péter Török가 제공 한 예를 참조하십시오. – Syntactic

0

벡터에서 항목을 제거하고 있습니다.

내부 루프의 각 반복마다 벡터의 내용을 출력하기 위해 일부 로깅을 사용하면 진행 상황을 볼 수 있습니다.

1

Iterator를 사용해야합니다. 설명서를 봐 http://java.sun.com/docs/books/tutorial/collections/interfaces/collection.html

당신은 읽을 수는, Iterator.remove는 반복하는 동안 컬렉션을 수정할 수있는 유일한 안전한 방법이라고

참고; 반복이 진행되는 동안 기본 컬렉션이 다른 방법으로 수정되면 비헤이비어가 지정되지 않습니다.

0

벡터에서 항목을 제거하면 벡터의 길이가 변경됩니다. 문제는 제거 후 코드가 너무 많은 노드를 제거하여 더 이상 유효하지 않은 인덱스를 사용하고 있다는 것입니다.

관련 문제