1

私はコースから学生を落とそうとしています.これは私がこれまでに得たものです..

public void dropStudent() {

 String id;     
 System.out.println(" Enter student ID " );     
 id = Keyboard.readString();

  for ( int i = 0; i <= students.length - 1; i++)   
  {
      if (id.equals(students[i].displayId()))
      {
          for (int j = i; j <= students.length - 1; j++)
          {
          students[i] = students[i+1];

          }

      }      
   } 
}

したがって、最初のループは配列の各要素に対するものであり、if ステートメントは、入力された ID が配列からの学生の ID と一致するかどうかを確認することです。2 番目の "For" は、要素を後方にシフトします。試してみると、特定の生徒が削除されます。ただし、要素を元に戻す代わりに、次の要素を両方の場所にコピーするだけです。要素を null に設定しようとしましたが、うまくいきませんでした。

提案はありますか?また、配列リストなどを使用することも許可されていません。

4

5 に答える 5

4

インスタンス化後に Java 配列のサイズを変更することはできません。必要なのは、学生 ID なしで配列を返すことだけである場合。要素を 1 つ減らして新しい配列を作成し、元の配列を反復処理して、削除する ID 以外をすべてコピーします。

通常、これにはリストを使用します。しかし、あなたの制約を考えると、それが私がそれに取り組む方法です.

何かのようなもの:

public String[] dropStudent(String delete, String[] students){
    int length=students.length-1, i=0;
    String[] remainingStudents= new String[length];

    for(String student: students){
        // catch the edge case where 'delete' is not found, and avoid the ArrayIndexOutOfBoundsException
        if(i==remainingStudents.length){
            return students;
        }
        // Add the any non-matching students to the final array.
        if(!student.equals(delete)){
            remainingStudents[i]=student;
            i++;
        }
    }
    return remainingStudents;
}
于 2013-02-11T03:32:57.767 に答える
2

次のいずれかを実行できます。

  1. 配列の特定の「x」位置にある要素を削除したい場合は、配列の次の位置にあるすべての要素を左にシフトするだけです。サイズ変数を保持し、それを減らします。

  2. オブジェクトが削除されたかどうかをマークするために使用される (学生情報を持つクラスに) フラグを設定できます。False -> 削除済み、True -> 削除されていません。

  3. 配列の代わりに ArrayList を使用できます。

順序が重要でない場合は、次のように簡単に実行できます。

 for ( int i = 0; i <= students.length - 1; i++)   
      if (id.equals(students[i].displayId()))
          students[i] = students[students.length-1];

最後の要素を取り、実際のギャップに入れます。ただし、最後の位置で何かを行う必要があり、何らかの方法でそれを空としてマークする必要があります (たとえば、null に設定できます)。

順序が重要な場合は、補助配列を使用できます。

Students [] removeFrom(Students [] old_array, int pos){
     Students [] new_array = new Students[old_array-1];
         
      for (int j = 0; j < i ; j++) new_array[j] = old_array[j];
 
      for (int j = i; j < new_array.length; j++) new_array[j] = old_array[j+1];
          
      return new_array;      
} 

の :

for ( int i = 0; i <= students.length - 1; i++)   
      if (id.equals(students[i].displayId()))
          students = removeFrom(students, i);
于 2013-02-11T03:30:17.833 に答える
2
  1. 2番目のループで変数「j」を使用します
  2. 「j+1」が範囲外の配列インデックスにならないようにロジックを修正してください
于 2013-02-11T03:40:47.320 に答える
2

置換:

students[i] = students[i+1];

と:

students[j] = students[j+1];

実際、削除する学生のインデックスを表すのではjなく、ループ変数を使用して配列の残りのすべてを調べたいと考えています。i

また、ループを置き換える必要があります:

for (int j = i; j <= students.length - 1; j++)

for (int j = i; j <= students.length - 2; j++)

(1 が 2 に変更されていることに注意してください)

これは、インデックス j+1 でアクセスstudentsしているためです。j == students.length - 1 の場合、students.length と等しくなり、ArrayOutOfBounException が発生します。

最後に、配列の最後の要素を null に設定する必要があります(そうしないと、最後の学生が複製されます)。さらに良いことに、配列のサイズを変更できます (つまり、新しい配列を作成し、その中の学生の新しいリストをコピーします)。

また、配列内に学生の複数のコピーがあり、最初のものだけを削除したい場合は、削除するbreak要素が見つかったときに追加する必要があります。

于 2013-02-11T03:26:02.523 に答える