2017-04-18 9 views
0

が、私は特定の位置に要素を挿入しようとしていますが、私はJavaで新しいです挿入要素が

ので、誰も助けることができるコードが

java.lang.ArrayIndexOutOfBoundsExceptionのエラーを投げている起きていません私のコードを修正する。私は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かそれともi < array.length -2かをチェックしています。

第2に、上記のように挿入方法を簡略化することができます。

+0

基本的に私は何が欠けていたのですか。 Yes this works –

+0

配列がいっぱいであれば動作しません。メソッドが 'public'なので、配列がいっぱいであるかどうかをチェックして追加することもできますし、新しいものを作成するか例外をスローするか、何もしないでください – ADS

+0

編集後* *いくつかの値。最悪の習慣です。あなたが要素を挿入することはできませんので、何らかの理由でそれを伝えるべきですが、捨てないでください! – ADS

0

配列の長さは、Javaで不変である、あなたはこのようなあなたは、私が小さいことを確認する必要があります一覧/ ArrayListの

0

問題は、コードのこのブロックである:あなたは、配列の最後のインデックスを越えたinsertArr[arrLength]にアクセスしている最初の繰り返しで

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

。したがって、反復を開始する必要があります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; 
} 
関連する問題