-1

Student の結果リストの ArrayList に計算結果を挿入しようとすると問題が発生します。

こんなふうになります。

  1. ArrayList (FullList と呼ばれる) は、Student オブジェクトのリストを保持します。
  2. Student オブジェクトには、名前 (文字列として) と結果リスト (ArrayList として) があります。
  3. Result オブジェクトを受け取ると、名前 (文字列として) と結果 (整数として) が付属しています。
  4. この Result オブジェクトを Student オブジェクトの結果リストに挿入したいと考えています。
  5. ただし、生徒の名前は事前に定義されていませんが、結果オブジェクトを受け取ると推測されます。
  6. つまり、FullList に Student オブジェクトがない場合、Result オブジェクトは Student オブジェクトの作成をトリガーし、それ自体を Student オブジェクトの結果リストに挿入します。次に、作成された Student オブジェクトが FullList に挿入されます。

以下のコードを書きましたが、各タグに複数の結果を挿入するのではなく、FullList に同じタグを複数挿入しています。

Q1: 何が悪いのかわからない!教祖からの心の刺し傷が必要です! Q2: 次のコードを最大 90,000 人の学生に使用します。これは学生の成績を収容する実行可能な方法ですか?

class Result {
   String name;
   int result;

   public Result(String name, int result) {
      this.name = name;
      this.result = result;
   }

   /* start - Getting hungup over this method
    *         Something is wrong here and i don't know what it is
    */
   public void setResult(ArrayList <Student> fullList) {

      for (Student s : fullList) {
         if (s.getName().equalsIgnoreCase(this.name)) {
            s.setResult(this);
         }
         else {         /* enters here if Student does not exist in fullList */
            Student s = new Student(this.name); /* create new student */
            s.setResult(this);                  /* insert result into Student's resultslist */
            fullList.add(s);                    /* add Student into fullList */
         }
      }
   }
   /* end */

   public String getName() {
      return this.name;
   }
}

class Student {
   String name;
   ArrayList <Result> resultslist;

   public Student(String name) {
      this.name = name;
      resultslist = new ArrayList <Result> ();
   }

   public void setResult(Result result) {
      this.resultslist.add(result);
   }

   public String getName() {
      return this.name;
   }
}

class StudentResults {

   public static void main (String [] args) {

      ArrayList <Student> FullList = new ArrayList <Student> ();

      Result r1 = new Result("John", 12);
      Result r2 = new Result("Jamie", 99);
      Result r3 = new Result("John", 69);
      Result r4 = new Result("Jacque", 56);
      Result r5 = new Result("Jacque", 100);
      Result r6 = new Result("Jamie", 100);

      r1.setResult(FullList);
      r2.setResult(FullList);
      r3.setResult(FullList);
      r4.setResult(FullList);
      r5.setResult(FullList);
      r6.setResult(FullList);

   }
}
4

2 に答える 2

2

リスト内の各学生について、この学生が挿入する結果と同じ名前を持っていない場合は、新しい学生を挿入します。

for (Student s : fullList) {
     if (s.getName().equalsIgnoreCase(this.name)) { // current student has same name as result
         s.setResult(this);
     }
     else { // current student doesn't have the same name as result
        Student s = new Student(this.name); 
        s.setResult(this);
        fullList.add(s);
     }
}

上記は次のように書く必要があります。

Student s = findStudentWithName(fullList, this.name);
if (s == null) {
    Student s = new Student(this.name); 
    s.setResult(this);
    fullList.add(s);
}
else {
    s.setResult(this);
}

そして、findStudentWithNameメソッドは次のようになります。

private Student findStudentWithName(List<Student> students, String name) {
    for (Student s : students) {
        if (s.getName().equalsIgnoreCase(name)) {
            return s;
        }
    }
    // no student found.
    return null;
}
于 2012-11-16T06:46:26.727 に答える
2

Map/HashMapList の代わりに次のように使用します。

       Map<String, Student> fullStudents= new HashMap<Student>();

そしてそれを次のように使用します:

    public void setResult(Map<String, Student> fullMap) {
            Student s = fullMap.get(this.name.toLowerCase());
            if(s == null){
              s = new Student(this.name);
              fullMap.put(this.name.toLowerCase(), s);
             }
             s.setResult(this);
     }

はるかにシンプルでクリーンです。

また、いつでも生徒のリストを取得するには、次のようにします。

       List<Student> fullList = fullMap.values();
于 2012-11-16T06:55:00.820 に答える