【问题标题】:How to fix array index out of bounds error?如何修复数组索引越界错误?
【发布时间】:2014-10-01 19:36:06
【问题描述】:

我遇到的错误

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 610
at Fib.sorted(Fib.java:67)
at Fib.main(Fib.java:17)

我的代码

public class Fib
{
    public static void main(String args[]) 
    {
        System.out.println(Arrays.toString( fiblist) );
        System.out.println(Fib.add());
        System.out.println(Fib.square());
        System.out.println(Fib.reversal());
        System.out.println(Fib.sorted());
    }

     public static int fiblist[] = {1,1,2,3,5,8,13,21,34,55,89,144,233,377,610,987,1597,2584,4181,6765};
     public static int fiblen = fiblist.length;

     public Fib() 
     {
        // Do nothing
     }

     public static ArrayList<Integer> sorted()
     {
         ArrayList sorted = new ArrayList();

         for(int counter = 0; counter < fiblist[4]; counter++ )
         {
             int temp1 = fiblist[counter];
             System.out.println("Elements stored " + temp1);
         }
         for(int counter = fiblist[14]; counter < fiblist[19]; counter++)
         {
             int temp2 = fiblist[counter];
             System.out.println("Last Elements stored " + temp2);
         }
         return sorted;
    }
}

我正在尝试将数组的最后 5 个元素存储在 temp 2 中。 然后我会切换它们。 有没有更简单的方法来做到这一点? 将数组的前五个元素与后五个元素交换? 您将如何使用 for 循环切换它们?

【问题讨论】:

  • 您的counter 应该是数组中的位置,而不是该位置的值。将counter &lt; fiblist[4] 更改为counter &lt; 4 并将int counter = fiblist[14] 更改为int counter = 14 以解决问题。
  • 这看起来很麻烦int counter = fiblist[14]; counter &lt; fiblist[19];,因为你得到的值远远高于你的列表大小
  • 还有counter &lt; fiblist[19]counter &lt; 19

标签: java arrays indexoutofboundsexception


【解决方案1】:

您混淆了数组索引和值。 fiblist[19] 是 6765。您希望计数器从 0 到 4 和 14 到 19,而不是 fiblist[19]。

for(int counter = 0; counter < 4; counter++ )
{
    int temp1 = fiblist[counter];
    System.out.println("Elements stored " + temp1);
}

for(int counter = 14; counter < 19; counter++)
{
    int temp2 = fiblist[counter];
    System.out.println("Last Elements stored " + temp2);
}

【讨论】:

  • 不要只是复制和粘贴 OP 的格式并更正代码问题,修复格式以便人们不必同时编辑问题您的答案.
  • 这部分运行。但是如何将 temp1 移动到数组的末尾?还是 temp2 到数组的开头?
  • @vDc 将 fiblist[19] 放入变量中,设置 fiblist[19] = fiblist[0],然后将变量的值放入 fiblist[0]。
【解决方案2】:

这行得通

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

for (int i=0;i<5;i++){
    temp=fiblist[i];
    fiblist[i]=fiblist[fiblist.length-i-1];
    //the first ellement= the last
    //the second=second from last...
    fiblist[fiblist.length-1-i]=temp;
}

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

输出:

1,1,2,3,5,8,13,21,34,55,89,144,233,377,610,987,1597,2584,4181,6765,
6765,4181,2584,1597,987,8,13,21,34,55,89,144,233,377,610,5,3,2,1,1,

【讨论】:

  • temp 只会显示“运动”吗?
【解决方案3】:

试试这个。这是一种排序算法(虽然相当糟糕)

public static void sort(int[] a) {
    int iMin;
    int n = a.length;
    for (int j = 0; j < n-1; j++) {
        iMin = j;
        for (int i = j+1; i < n; i++) {
            if (a[i] < a[iMin]) {
                iMin = i;
            }
        }
        if(iMin != j) {
            swap(j, iMin, a);
        }
    }
}

public static void swap(int i, int j, int[] arr){
    int temp = arr[i];
    arr[i] = arr[j];
    arr[j] = temp;
}

【讨论】:

    猜你喜欢
    • 2017-06-30
    • 1970-01-01
    • 2013-12-21
    • 2017-07-26
    • 1970-01-01
    • 2015-06-13
    • 2015-12-08
    • 2014-06-06
    • 2015-03-22
    相关资源
    最近更新 更多