2016-12-29 3 views
1

Javaに関する質問があります。このコードでは、負の数と正の数を2つの配列に分割し、その後にそれらを出力しました。しかし、私は、私はエラーがあることを開始し、すべての時間:ここで2つの配列に番号を区切るJava

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 6 
at mypackages.MyClass.main(MyClass.java:26) 

は、私が書いたコードは次のとおりです。

package mypackages; 

public class MyClass { 

public static void main(String[] args) { 

    int[] array = {12, 23, -22, 0, 43, 545, -4, -55, 43, 12, 0, -999, -87}; 

    int counterNeg = 0; 
    int counterPoz = 0; 

    for (int i = 0; i < array.length; i++) { 
     if (array[i] < 0){ 
      counterNeg++; 
     } else if (array[i] > 0){ 
      counterPoz++; 
     } 
    } 


    int[] arrayNeg = new int[counterNeg]; 
    int[] arrayPoz = new int[counterPoz]; 

    for (int j = 0; j < array.length; j++) { 
     if (array[j] < 0){ 
      arrayNeg[j] = array[j]; 
     } else if (array[j] > 0){ 
      arrayPoz[j] = array[j]; 
     } else { 
      continue; 
     } 
    } 
+2

良い機会にデバッガを使用する方法とコードを段階的にデバッグして何が起きているのかを理解する。 – assylias

+1

一般に、 'arrayPoz'または' arrayNeg'は 'array'と同じ長さではないので、2番目のループはこのエラーの原因になることは明らかです。 –

+0

'counterNeg'と' counterPoz'は常に 'array.length'より小さいです。したがって、 'java.lang.ArrayIndexOutOfBoundsException'を取得しました。 –

答えて

2

あなたが上がるインデックスを使って配列arrayNegarrayPozにアクセスしています両方の配列が元の配列よりも小さいため、ArrayIndexOutOfBoundsを発生させるarray.length - 1に変更します。

ソリューション:2つの下流の配列にして数字を挿入する場所を追跡:

int[] arrayNeg = new int[counterNeg]; 
int[] arrayPoz = new int[counterPoz]; 
int arrayNegCounter = 0; 
int arrayPozCounter = 0; 

for (int j = 0; j < array.length; j++) { 
    if (array[j] < 0){ 
     arrayNeg[arrayNegCounter] = array[j]; 
     arrayNegCounter++; 
    } else if (array[j] > 0){ 
     arrayPoz[arrayPozCounter] = array[j]; 
     arrayPozCounter++; 
    } else { 
     continue; 
    } 
} 
0
for (int a = 0, b = 0, j = 0; j < array.length; j++) { 
    if (array[j] < 0){ 
     arrayNeg[a++] = array[j]; 
    } else { 
     arrayPoz[b++] = array[j]; 
    } 
} 

問題がarrayNegとarrayPozにアクセスするには、インデックスとしてJを使用してからある、大きさということを覚えています各配列の等価ではない。

1

この質問への前の答えは間違いなく問題を解決するが、それは、これは代わりにそれを自分で実装するので、あなたが解決するためにJavaのストリームを使用したい場合があり、問題の一種であることは注目に値します:

Map<Boolean, List<Integer>> map = 
    Arrays.stream(array) 
      .filter(i -> i != 0) 
      .boxed() 
      .collect(Collectors.partitioningBy(i -> i > 0)); 
List<Integer> positives = map.get(Boolean.TRUE); 
List<Integer> negatives = map.get(Boolean.FALSE); 
関連する問題