2017-04-18 48 views
0

我想在特定的位置插入一個元素,但代碼拋出插入元素不會發生

java.lang.ArrayIndexOutOfBoundsException的錯誤

我在java中新,所以任何人可以幫助我糾正我的代碼。我知道在insertPosition方法的insertArr[i+1] = insertArr[i];中做錯了。任何幫助都會得到很好的幫助。

我的代碼

public static void main(String[] args) { 
     Scanner in = new Scanner(System.in); 
     int[] insertArr = {10,30,20,40,60,50,90,70,80}; 
     Arrays.sort(insertArr); 
     int arrLength = insertArr.length; 
     System.out.println("At what position you want to insert"); 
     int pos = in.nextInt(); 
     System.out.println("What element you want to insert"); 
     int key = in.nextInt(); 
     insertPosition(insertArr,arrLength,pos,key); 
     for(int num : insertArr){ 
      System.out.println(num); 
     } 
    } 
    public static int insertPosition(int insertArr[],int arrLength, int pos, int key){ 
     if(pos > arrLength) 
      return arrLength; 
     for(int i=arrLength-1; i>=(pos-1); i--) 
      insertArr[i+1] = insertArr[i]; 
     insertArr[pos-1] = key; 
     return arrLength; 
    } 
+1

你爲什麼不使用https://docs.oracle.com/javase/7/docs/api/java/util/List.html#add (int,%20E) 像這樣: insertArr.add(pos,key); –

+0

我想做一些編碼練習,所以編寫我自己的排序數組的方法。 –

+0

除了編寫自己的代碼我建議你*閱讀*一些標準的代碼。他們中的大多數都包含評論,記錄良好並且關心許多以前你不知道的事情;)至少,它對我有幫助。 – ADS

回答

2

您需要確保我少insertArray長度大於零。

public static void main(String[] args) { 
    Scanner in = new Scanner(System.in); 
    int[] insertArr = {10, 30, 20, 40, 60, 50, 90, 70, 80}; 
    Arrays.sort(insertArr); 
    System.out.println("At what position you want to insert"); 
    int pos = in.nextInt(); 
    System.out.println("What element you want to insert"); 
    int key = in.nextInt(); 
    insertPosition(insertArr, pos, key); 

    Arrays.stream(insertArr).forEach(System.out::println); 
} 

public static void insertPosition(int insertArr[], int pos, int key) { 
    if (pos >= insertArr.length) 
     return; 
    for (int i = insertArr.length - 1; i > (pos - 1) && i < insertArr.length -1; i--) 
     insertArr[i + 1] = insertArr[i]; 
    insertArr[pos - 1] = key; 
} 

在陣列的長度的java是不可變的,當要調用用於從索引的元素不存在,則收到此異常。爲了避免在for循環中檢查是否i< array.length或我array.length -2。

其次你的插入方法可以簡化,就像上面一樣。

+0

所以基本上我錯過了什麼。是的,這是有效的 –

+0

如果數組已滿,它將不起作用。由於方法是'public',你也可以添加檢查數組是否已滿,如果是,則創建新的或拋出異常或什麼都不做 – ADS

+0

編輯後,你可能*丟失*一些價值。這是最糟糕的做法。爲了不能插入元素,你應該以某種方式發出信號,但不要扔掉! – ADS

0

數組的長度是在Java中不可變的,你必須使用某種形式的集合,如列表/ ArrayList的

0

的問題是在這個代碼塊:

for(int i=arrLength-1; i>=(pos-1); i--) 
    insertArr[i+1] = insertArr[i]; 

在你所訪問insertArr[arrLength]超過數組的最後一個索引中的第一迭代。所以你應該開始迭代從i=arrLength-2;

+0

正確,但我不這麼認爲,我應該開始i = arrLength-2。 –

0

首先,你必須從變量pos中減去1,並驗證它是否在數組長度的範圍內。

您的代碼應該是這樣的:

public static void main(String[] args) { 
    Scanner in = new Scanner(System.in); 
    int[] insertArr = { 10, 30, 20, 40, 60, 50, 90, 70, 80 }; 
    Arrays.sort(insertArr); 
    int arrLength = insertArr.length; 
    System.out.println("At what position you want to insert"); 
    int pos = in.nextInt(); 
    System.out.println("What element you want to insert"); 
    int key = in.nextInt(); 
    insertPosition(insertArr, arrLength, pos, key); 
    for (int num : insertArr) { 
     System.out.println(num); 
    } 
} 

public static int insertPosition(int insertArr[], int arrLength, int pos, int key) { 

    pos = pos - 1; 

    if (pos >= arrLength || pos < 0) 
     return arrLength; 

    for (int i = arrLength - 1; i >= pos; i--) { 
     insertArr[i] = insertArr[i]; 
    } 
    insertArr[pos] = key; 

    return arrLength; 
}