2010-11-29 11 views
0

いいえ私はJavaクラスへの私のこのプログラムを終了しようとしています、そして、私はこの1つの部分に問題があります。これを除いて他のすべてが働いています。私は3つの配列、1文字列、2種類のint、すべての並列を持っています。私はアルファベット順に番号順に並べ替える必要があります(文字列配列を使用し、最初のint配列、並べ替えは3番目の配列の影響を受けません)。Javaソート並列配列、助けが必要(NullPointerExceptionエラー)

これはこれまで私が持っていたコードです。

public static void sortDatabase(int numRecords, String[] sDeptArr, 
       int[] iCourseNumArr, int[] iEnrollmentArr) 
    { 
     System.out.println("Sort the database. \n"); 
     String sTemp = null; 
     int iTemp = 0; 
     int eTemp = 0; 
     for(int i=0; i<numRecords; i++) 
     { 
      int iPosMin = i; 
      for(int j=i+1; j<numRecords; j++) 
      { 
       String a = sDeptArr[j]; 
       String b = sDeptArr[iPosMin]; 
       if(a.compareTo(b) != 0) 
        iPosMin = j; 
       else if(!sDeptArr[j].equals(sDeptArr[iPosMin]) && iCourseNumArr[j] < iCourseNumArr[iPosMin]) 
        iPosMin = j; 
      } 
      sDeptArr[i] = sTemp; 
      sDeptArr[i] = sDeptArr[iPosMin]; 
      sDeptArr[iPosMin] = sTemp; 
      iCourseNumArr[i] = iTemp; 
      iCourseNumArr[i] = iCourseNumArr[iPosMin]; 
      iCourseNumArr[iPosMin] = iTemp; 
      iEnrollmentArr[i] = eTemp; 
      iEnrollmentArr[i] = iEnrollmentArr[iPosMin]; 
      iEnrollmentArr[iPosMin] = eTemp; 
     } 
    } 

これはjavaで行う必要があります。

if(a.compareTo(b) != 0) 

からなる15行目でエラーが発生し、NullPointerExceptionが発生しています。

基本的には、偽のクラス名とコース番号を並べ替えると同時に、対応するインデックスと並行して登録された人数をコース名と番号に並べ替えています。

+0

なぜ、1つのオブジェクトにすべてのデータをカプセル化するのではなく、3つの別々の配列を使用していますか? –

+0

@Anonは宿題のように聞こえます –

+0

aまたはbはnullです。 – Codemwnci

答えて

0

私は

if(a.compareTo(b) != 0)

からなる15行でエラーになっていると私は、NullPointerExceptionが取得しています。

これは、配列内の要素の1つがnullであることを示します。アレイの内容を確認して、並べ替えるものにnull要素が含まれていないことを確認します。配列インデックスが0から始まることを忘れていないことを確認してください。nullが配列の事前ソートを行う正当な値であれば、コードがそれを守っていることを確認してください。

1

あなたの第二のループ(for (int j=... 1)した後、次のコードがあります:コードを熟読から

 sDeptArr[i] = sTemp; 
     sDeptArr[i] = sDeptArr[iPosMin]; 
     sDeptArr[iPosMin] = sTemp; 

を、私の理解は、しかし、あなたがsDeptArr[i]sDeptArr[iPosMin]内の要素を交換しようとしているということです、あなたの割り当ては間違っています。

宿題があるとすれば、なぜこのコードがうまくいかないのかを調べて、結果が得られるはずです。あなたは、デバッガのコードをステップ実行することができますか、(かなり簡単ですが)あなたの頭のコードをステップ実行することができます。

+0

+1は本当の問題を発見します。ヒント:この問題は他の問題を引き起こしています。これを最初に修正し、もう一度試してください。 –

1

これは、a == nullの場合にのみ発生します。しかし、aはsDeptArr [j]です。配列のこの要素がnullであることを意味します。

したがって、このメソッドに送信するデータには一貫性がありません。

しかし、なぜこのような並べ替えを実装していますか?この問題を解決する「正しい」方法は、必要な数のフィールドを含む新しいデータ構造を作成することです。次に、1つの配列を作成し、Arrays.sort()を使用して並べ替えます。私が言及したデータ構造はComparableを実装すべきです。

これがソートの練習であっても、データ構造と1つの配列と書き込みソートアルゴリズムを作成します。

そしてさらに別の注記。あなたのメソッドは配列と長さを別々のパラメータとして受け入れるので、Cのバックグラウンドがあるようです。 Java配列はその長さを "知っています"。配列aの長さを取得するには、a.lengthを使用します。

+0

私は、配列のサイズが必ずしもその配列のレコード数を反映しているとは限らないことを推測します。つまり、カウンタ変数です。 –

0

あなたは配列レベルにとどまる必要があり(実際の世界ではより高いレベルのデータ構造を作成する必要はありません)、バブルソートを使用する必要があると仮定します(実際には使用しているようですが、すべきではありません)...

あなたは自分自身をあまりにも多くの一時的な位置/変数に縛られてしまいます。あなたは実際には、全長の最大値のためにループ外側を実行する必要があり、検査されていない各インデックス(bubble sortを参照)の内側は、あなたの基準に基づいて "i"を "i + 1"この場合はほとんど)、それらが後方にある場合はそれらを「交換」します。

関連する問題