1

如果您想知道,我不是想简单地首先对具有最小数字的数组进行排序,而是尝试通过首先显示数字最接近 0 的数组列表来对数组进行排序。

它适用于数组中的某些元素,但是当它需要向后遍历数组时,它不会......它只是抛出一个超出范围的异常

这是我的代码:

package SSTF;

public class test2 {

    public static void main (String[] args)
    {
        int[] temp_array = {9, 22, 3, -4, 5, 8};



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

                System.out.print(temp_array[i] + "    ");
    }

    System.out.println("\n\nNumbers closest to 0:\n");

    closestToZero(temp_array);



    }

    public static void closestToZero(int[] array) 
    {
        int num = array[0];
        int absNum = Math.abs(num);


        for(int i = 1; i < array.length; ++i) 
        {
            int newAbs = Math.abs(array[i]);

            if(newAbs < absNum) 
            {

                absNum = newAbs;
                num = array[i];

                for(int j=0; j<array.length; j++)
                {
                    System.out.print(array[i+j] + "   ");
                }
            }   
        }
    }
}

我真的希望这只是一件小事,有人可以提供帮助,因为我不知道如何解决它:S

输出:

9    22    3    -4    5    8    

Numbers closest to 0:

3   -4   5   8 Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 6
    at SSTF.test2.closestToZero(test2.java:42)
    at SSTF.test2.main(test2.java:18)
4

5 回答 5

2

这是你的问题:

System.out.print(array[i+j] + "   ");

考虑以下情况,当:

  • i == array.length - 1
  • j == array.length - 1, 然后
  • 的总和i+j2 * array.length - 2,

这很可能超出了数组的范围。

于 2012-11-21T22:24:38.200 回答
2

这是您i+j在内部循环中使用的。我不完全确定您要在那里做什么,但是,由于这两个变量都可以达到length-1,显然总和会大于那个,因此边界异常。

您可能应该问自己,为什么每次找到接近零的元素时都要重新打印出数组。

于 2012-11-21T22:25:22.177 回答
2

问题很可能出在这行代码上:

System.out.print(array[i+j] + "   ");

你能保证它i + j始终是你的数组的有效索引吗?请记住,有效索引必须介于 0 和 之间size - 1,其中size是数组元素的数量。

于 2012-11-21T22:25:52.790 回答
2

正如其他人所指出的,它是用于i+j对导致异常的数组进行索引。

现在,我不会从头开始编写自己的排序例程,而是使用以下答案中的代码以及适当的比较器:

https://stackoverflow.com/a/3699501/367273

如果你可以使用Integer[]而不是int[],你甚至不需要ArrayUtils,并且可以Arrays.sort(T[] a, Comparator<? super T> c)直接使用。

于 2012-11-21T22:33:12.003 回答
1

我认为这种方式更好

     int[] temp_array = {9, 22, 3, -4, 5, 8};



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

                System.out.print(temp_array[i] + "    ");

        }

    System.out.println("\n\nNumbers closest to 0:\n");

Arrays.sort(temp_array);

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

    System.out.println(temp_array[i]);

}

}
于 2012-11-22T00:26:42.203 回答