0

私は知っている

Collections.frequency(obj1,obj2);  

オブジェクト obj2 がコレクション obj1 に存在する回数がわかります。しかし、私はobj1がオブジェクト(学生)からなるコレクション(リスト)であると言いたいです。

生徒は {name,marks} を持つことができます

次に、同じ点数を獲得した学生の数を見つけることができる単一または2行の方法はありますか?

余分なライブラリを含めたくない

4

4 に答える 4

4

Collection.frequency 指定されたオブジェクトと等しい、指定されたコレクション内の要素の数を返します。それは基本的に obj2 を List オブジェクトと同等にします。

メソッドをオーバーライドして、equals スコア属性オブジェクトに基づいてロジックを配置すると、オブジェクトは等しいかどうかになります。次にCollection.frequency、目的の結果を返します。

public class Student{
    private String name;
    private int score;
    @Override
    public boolean equals(Object obj){
         if(obj == null)
           return false;
         else if(this==obj)
           return true;
         else 
           return this.hashCode() == ((Student)obj).hashCode();
    }
    @Override
    public int hashCode() {
         return score;
   }
}

...

int freq = Collections.frequency(listOfStudent,student);  
于 2013-02-25T07:55:35.383 に答える
1

同じスコア==同じ学生を意味するようにメソッドを変更することに消極的である場合equalsは、マップを使用して、私が思うことを達成できます。もう少しセットアップを行う必要がありますが、取得は 1 ~ 2 行で行う必要があります。

// setup/population
Map<Score, List<Student>> map = new HashMap<Score, List<Student>>();
for (Student student : students) {
  List<Student> studentsForScore = new ArrayList<Student>();
  if(map.containsKey(student.getScore())) {
    studentsForScore = map.get(student.getScore());
  }
  studentsForScore.add(student);
  map.put(student.getScore(), studentsForScore);
}

// information retrieval
Student testStudent = ...
int numberOfStudentsWithSameScore = map.containsKey(testStudent.getScore()) ? map.get(testStudent.getScore()).size() : 0;

これはもちろん、セットアップ ブロックのコストを受け入れる意思があることを前提としています。

Comparatora (または同等のもの) をメソッドに渡すことができると便利ですCollections.frequency。できれば、両方の長所を活かすことができます。あなたができないように、上記のコードを独自のfrequencyメソッドにラップすることができます

于 2013-02-25T10:05:39.307 に答える
0

addAll学生のマークを のマークにSet合わせて、セットのサイズが元のサイズより小さいかどうかを比較することができますList/ Map.

于 2013-02-25T07:59:19.760 に答える
0

リストの代わりにマップを使用する必要があると思います

于 2013-02-25T07:52:10.917 に答える