2014-11-12 15 views
0

내 프로그램의 문제가 단순히 배열을 선언 한 위치에 있는지 또는 둘 이상으로 채우고 있는지 확실하지 않습니다. 가져가도 돼. 내가 얻을'java.lang.ArrayIndexOutOfBoundsException'오류를 해결할 수 없습니다.

import java.util.Scanner; 
import java.util.Arrays; 

public class EliminateDuplicates { 
public static void main(String[] args) { 

    int[] numberList = new int[10]; 

    System.out.println("Please enter ten integers."); 

    Scanner input = new Scanner(System.in); 

    for (int i = 0; i < numberList.length; i++) { 

     numberList[i] = input.nextInt(); 

     } 

    int[] newNumberList = new int[10]; 

    newNumberList = eliminateDuplicates(numberList); 


    System.out.println("The discrete numbers are: "); 

    for (int i = 0; i < newNumberList.length; i++) { 

      System.out.println(newNumberList[i] + ' '); 

     } 

    } 

public static int[] eliminateDuplicates(int[] numberList) { 

    int[] noDuplicateList = new int[numberList.length]; 

    int size = 0; 

    java.util.Arrays.sort(numberList); 

    for (int i = 0; i < numberList.length; i++) { 

     if (numberList[i] != numberList[i+1]) { 

      noDuplicateList[i] = numberList[i]; 

      size++; 
     } 

    } 

    return noDuplicateList; 
} 

}

이 출력 + 오류 메시지는 다음과 같습니다 :

Please enter ten integers. 
9 
8 
7 
3 
3 
4 
1 
2 
8 
6 
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 10 
at EliminateDuplicates.eliminateDuplicates(EliminateDuplicates.java:51) 
at EliminateDuplicates.main(EliminateDuplicates.java:28) 

답변

3

귀하의 문제는 여기에 있습니다 :

for (int i = 0; i < numberList.length - 1; i++) { 
    if (numberList[i] != numberList[i+1]) { 
다음

내 코드입니다

i 체스 numberList.length-1, i+1이 배열 범위를 벗어났습니다.

루프 범위를 변경해야합니다. noDuplicateList 목록에 할당 할 때 size 색인도 사용하십시오. 그렇지 않으면 해당 목록에 틈이 생깁니다.

for (int i = 0; i < numberList.length - 1; i++) { 
    if (numberList[i] != numberList[i+1]) { 
     noDuplicateList[size] = numberList[i]; 
     size++; 
    } 
} 

그래도 경미한 문제가 있습니다. eliminateDuplicates 메서드는 입력과 같은 크기의 배열을 반환하므로 중복이있는 경우 출력 배열의 끝에는 사용되지 않은 인덱스 (즉, 0이 포함됨)가 있습니다. 이를 방지하려면 입력 배열의 모든 항목을 HashSet에 추가하고 해당 집합의 size()을 찾고 해당 출력의 배열을 만듭니다. Set을 사용하면 Set이 중복을 제거하고 입력 배열을 정렬 할 필요가 없기 때문에 코드를 단순화합니다. 귀하의 문제가 여기에있다

public static int[] eliminateDuplicates(int[] numberList) { 

    Set<Integer> noDups = new HashSet<Integer>(); 

    for (int num : numberList) 
     noDups.add(num); 

    int[] noDuplicateList = new int[noDups.size()]; 

    Iterator<Integer> iter = noDups.iterator(); 
    for (int i=0; i<noDuplicateList.length && iter.hasNext();i++) 
     noDuplicateList[i]=iter.next(); 

    return noDuplicateList; 
} 
+0

좋아, 감사합니다. 나는 그것을 할 수있는 더 좋은 방법이 있는지 궁금해하고있었습니다 ... 그래도 여전히 이상한 30 대 번호가 있습니다. – yves

+0

@lawizeg 최근 편집 내역보기 – Eran

0

, eliminateDuplicates :

if (numberList[i] != numberList[i+1]) {// i+1, for the last elements raise the exception 
0
if (numberList[i] != numberList[i+1]) 

i=9이 경계를 벗어난 인덱스 10를 찾을 것입니다. 난 경우 두 번째 조건이 범위를 벗어났습니다 numberList.length 동일

if (numberList[i] != numberList[i+1]) { 

:

0

문제는이 라인입니다.

그래서 당신은 변경해야합니다 :

for (int i = 0; i < numberList.length; i++) { 

TO :

for (int i = 0; i < numberList.length-1; i++) { 
관련 문제