2014-02-17 37 views
-2

我想用Java編寫一個程序,它接受三個數組並返回刪除了最小值的數組。我想我正在創建新的陣列是錯誤的。雖然它看起來編譯罰款,我每次運行它的時候,我得到以下信息:線程「main」 java.lang.ArrayIndexOutOfBoundsException從Java中的數組中刪除最低值

例外:5

任何幫助將不勝感激!

這裏是我的代碼:

import java.util.Arrays; 

class LowestGrade 
{ 
    public static void main (String [] args) 
    { 
     int [] a = removeLowest (23, 90, 47, 55, 88); 
     int [] b = removeLowest (85, 93, 42); 
     int [] c = removeLowest (59, 92, 93, 47, 88, 47); 

     System.out.println ("a = " + Arrays.toString(a)); 
     System.out.println ("b = " + Arrays.toString(b)); 
     System.out.println ("c = " + Arrays.toString(c)); 
    } 

    public static int[] removeLowest (int...grades) 
    { 
     if (grades.length <= 1) 
     { 
     return grades; 
     } 

     else 
     { 
      int [] newArray = new int [grades.length - 1]; 
      int lowest = grades [0]; 

      for (int i = 0; i < grades.length; i++) 
      { 
      for (int n = 0; n <= grades.length; n++) 
      { 
       if (grades[n] > lowest) 
       { 
       newArray[i] = grades[n]; 
       i++; 
       } 

       else 
       { 
       lowest = grades[n]; 
       } 
      } 
      } 

      return newArray; 
     } 
    } 
} 
+8

你覺得什麼錯誤意味着什麼?它沒有得到更明顯的爲什麼發生錯誤比這個。 –

+0

錯誤在這裏'如果(等級[n]>最低)'你的n大於'等級'大小。 – Brian

+0

另外你爲什麼使用嵌套循環?你可以在一個簡單的循環中做到這一點(如果你不關心結果數組的順序)。 –

回答

-3

友情提示:檢查第二for -loop的for -loop界限。

1

你或許應該張貼整個例外:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 5 
    at LowestGrade.removeLowest(LowestGrade.java:32) 
    at LowestGrade.main(LowestGrade.java:7) 

這意味着您正在訪問具有小於6個元素的數組的第6元。在你的情況下,你陣列只有5種元素,其有效的索引是0,1,2,3和4。

解決方法是,以除去嵌套循環:

int lowest = grades [0]; 
for (int i = 1; i < grades.length; i++) 
{ 
    if(lowest > grades[i]) 
    { 
     lowest = grades[i]; 
    } 
} 
return removeElement(grades, lowest); 

.. 

public static int[] removeElement(int[] original, int element) 
{ 
    int[] n = new int[original.length - 1]; 
    System.arraycopy(original, 0, n, 0, element); 
    System.arraycopy(original, element+1, n, element, original.length - element-1); 
    return n; 
} 

removeElementthis answer

-1

以下行是一般的編程錯誤:

  1. newArray[i] = grades[n];

作爲newArray尺寸已經減少了一個,它可以保持值i = grades.length時。

  1. for (int n = 0; n <= grades.length; n++)

當n = grades.length,等級[n]的拋出ArrayIndexOutOfBoundsException異常異常。所以,應該是for (int n = 0; n < grades.length; n++)

在你的方式,你可以簡化如下重新編寫方法:

public static int[] removeLowest(int... grades) { 

     if (grades.length <= 1) { 
      return grades; 
     } 

     else { 

      // find lowest first 

      int lowest = grades[ 0 ]; 

      for (int i = 1; i < grades.length; i++) { 

       if (grades[ i ] < lowest) { 
        lowest = grades[ i ]; 
       } 
      } 

      // build the new array 
      int[] newArray = new int[ grades.length - 1 ]; 

      for (int i = 0, j = 0; i < grades.length; i++) { 

       if (grades[ i ] == lowest) { 
        continue; 
       } 

       newArray[ j++ ] = grades[ i ]; 
      } 

      return newArray; 
     } 
    }