似乎无法修复我的' java.lang.ArrayIndexOutOfBoundsException'错误

时间:2014-11-12 06:31:56

标签: java arrays

我不确定我的程序中的问题是否只是在我声明数组的地方,或者我是否填充其中一个而不是他们可以采取的。

这是我的代码:

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)

4 个答案:

答案 0 :(得分:3)

你的问题在这里:

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

i到达numberList.length-1时,i+1超出数组范围。

您应该更改循环的范围。您在分配到size列表时也会使用noDuplicateList索引,否则您将在该列表中出现空白。

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

你仍然会遇到一个小问题。由于您的eliminateDuplicates方法返回与输入大小相同的数组,如果存在重复项,则输出数组的末尾将包含未使用的索引(将包含零)。如果您希望避免这种情况,可以将输入数组的所有项添加到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;
}

答案 1 :(得分:0)

您的问题在这里,eliminateDuplicates

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

答案 2 :(得分:0)

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

i=9时,这会查找超出范围的索引10

答案 3 :(得分:0)

问题在于这一行:

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

如果i等于numberList.length,则第二个条件超出范围。

所以你必须改变:

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

TO:

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