这个程序从哪里得到它的数字,为什么这是由增加1个数组大小引起的? (JAVA)

时间:2011-12-01 02:50:57

标签: java methods indexoutofboundsexception

该程序只是为了消除数组中的重复项。但是,remove方法中的第二个for循环是抛出一个超出范围的异常。我正在寻找并且无法看到它是怎么回事,所以我想我会将数组大小增加1,这样我就可以使用唯一的缺点就是在结尾添加额外的0。

令我惊讶的是,当我将tracker []的大小从10增加到11时,程序会打印出从0到9的每个数字,即使我没有输入大部分数字。这些数字来自哪里,为什么我遇到这个问题?

import java.util.*;
class nodupes 
{
    public static void main(String[] args) 
    {   

        int[] dataset = new int[10];


        //getting the numbers
        for (int i = 0; i <= 9 ; i++)
        {
            Scanner input = new Scanner(System.in);
            System.out.println("Enter a one digit number");
            dataset[i] = input.nextInt();
        }

        int[] answer = (eliminateduplicates(dataset));
        System.out.println(Arrays.toString(answer));
    }

    public static int[] eliminateduplicates(int[] numbers)
    {

        boolean[] tracker = new boolean[11];
        int arraysize = 1; 
        for(int k = 0; k <= 9; k++)
        {

            if(tracker[numbers[k]] == false)
            {
                arraysize++;
                tracker[numbers[k]] = true;
            }

        }
        int[] singles = new int[arraysize];

        for(int l = 0; l <= arraysize; l++)
        {
            if(tracker[l] == true)
            {
                singles[l] = l;

            }


        }

        return singles;
    }
}    

此部分发生了例外

     if(tracker[l] == true)

但仅当跟踪器大小为10.在11时它只打印[0,1,2,3,4,5,6,7,8,9]

编辑:arraysize = 1是调试的暂停,最初是0

编辑:修正了它,但现在最后有一个0,即使数组应该完全填满。

public static int[] eliminateduplicates(int[] numbers)
{

    boolean[] tracker = new boolean[10];
    int arraysize = 0; 

    for(int k = 0; k < numbers.length; k++)
    {

        if(tracker[numbers[k]] == false)
        {
            arraysize++;
            tracker[numbers[k]] = true;
        }

    }
    int[] singles = new int[arraysize];
    int counter = 0;

    for(int l = 0; l < arraysize; l++)
    {
        if(tracker[l] == true)
        {
            singles[counter] = l;
            counter++;
        }


    }

    return singles;
}

5 个答案:

答案 0 :(得分:1)

由于数组从0开始,你的数组大小将比唯一数字的数量大一个,所以你的最后一个循环经历了太多次。换句话说,“l”(字母l - 尝试使用不同的变量名称)将达到11,如果您有10个唯一数字,并且跟踪器只有项目0-10,因此超出范围异常。尝试将声明更改为         int arraysize = 0;

答案 1 :(得分:1)

再次被&lt; =

击败
for(int l = 0; l <= arraysize; l++)

数组大小为10表示0-9,此循环将为0-10

数字的来源,

singles[l] = l;

将计数值分配到单个字段中,因此单个[1]被指定为1,等等。

答案 2 :(得分:0)

我觉得你做了太多的处理没有重复,如果你没有不使用Collections的限制,那么你可以尝试这个

public class NoDupes {
    public static void main(String[] args) {
        Integer[] dataset = new Integer[10];
        for (int i = 0; i < 10; i++) {
          Scanner input = new Scanner(System.in);
          System.out.println("Enter a one digit number");
          dataset[i] = input.nextInt();
        }
        Integer[] arr = eliminateduplicates(dataset);
        for (Integer integer : arr) {
           System.out.println(integer);
        }
    }

     public static Integer[] eliminateduplicates(Integer[] numbers) {
        return new HashSet<Integer>(Arrays.asList(numbers)).toArray(new Integer[]{});
     }
}

要回答你的问题,你的最后一个循环会比一个索引更多。

答案 3 :(得分:0)

Java中数组中有效索引的范围是[0, SIZE),即。从0到arraysize-1

你获得异常的原因是因为在你的循环中你从0到arraysize 包含,1指数太过迭代:

for(int l = 0; l <= arraysize; l++)

因此,当您在上一次迭代中转到if(tracker[l] == true)时,l将等于arraysize,而tracker[l]将超出数组的范围。您可以通过在<=循环条件中将<更改为for来轻松解决此问题。


当数组的大小从10更改为11时问题消失的原因与arraysize在导致问题的for循环之上增加到10的情况有关。这次,singles[10]是数组中的有效元素,因为数组中的索引范围现在为[0, 11)

编辑:实际上arraysize有可能增加到11,我认为它初始化为0,在这种情况下它只会达到10.无论哪种方式,上面仍然是有效;您尝试在数组中访问的最后一个索引必须比数组的长度小1,以避免您获得的异常,因为数组是从零开始的。所以是的,长话短说,<=应该是<

答案 4 :(得分:0)

编辑20,因为我真的应该睡着了。意识到我可能只是为你做了功课所以我删除了代码。

arraySize应该从0开始,因为你没有数字开始,并且当你发现重复时开始添加到这个大小。假设只有1个数字重复十次,你就会创建一个大小为2的数组来存储1个数字。 int arraysize = 0;

你的第一个for循环应循环遍历numbers,因此在循环约束中使用数字的长度是有意义的。 for( int i = 0; i < numbers.length; i ++)

对于第二个for循环:你需要遍历整个tracker数组,所以不妨使用它的长度(tracker.length)。更少的魔术数字总是一件好事。您还需要另一个变量来跟踪singles数组中的位置。如果数字是10 9的数组,那么只有跟踪器[9]才是真的,但这应该放在单个[0]中。再一次,我的解释不好,但没有图表就很难。

Derp derp,我觉得自己很好/上床睡觉,所以瞧,我用过的代码(有一次我尝试测试它):

public static int[] eliminateduplicates(int[] numbers)
{
    boolean[] tracker = new boolean[10];
    int arraysize = 0; 

    for(int k = 0; k < numbers.length; k++)
    {
        if(tracker[numbers[k]] == false)
        {
            arraysize++;
            tracker[numbers[k]] = true;
        }
    }

    int[] singles = new int[arraysize];

    for(int l = 0, count = 0; l < tracker.length; l++)
    {
        if(tracker[l] == true)
        {
            singles[count++] = l;
        }
    }

    return singles;
}