私は知っている
Collections.frequency(obj1,obj2);
オブジェクト obj2 がコレクション obj1 に存在する回数がわかります。しかし、私はobj1がオブジェクト(学生)からなるコレクション(リスト)であると言いたいです。
生徒は {name,marks} を持つことができます
次に、同じ点数を獲得した学生の数を見つけることができる単一または2行の方法はありますか?
余分なライブラリを含めたくない
私は知っている
Collections.frequency(obj1,obj2);
オブジェクト obj2 がコレクション obj1 に存在する回数がわかります。しかし、私はobj1がオブジェクト(学生)からなるコレクション(リスト)であると言いたいです。
生徒は {name,marks} を持つことができます
次に、同じ点数を獲得した学生の数を見つけることができる単一または2行の方法はありますか?
余分なライブラリを含めたくない
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);
同じスコア==同じ学生を意味するようにメソッドを変更することに消極的である場合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;
これはもちろん、セットアップ ブロックのコストを受け入れる意思があることを前提としています。
Comparator
a (または同等のもの) をメソッドに渡すことができると便利ですCollections.frequency
。できれば、両方の長所を活かすことができます。あなたができないように、上記のコードを独自のfrequency
メソッドにラップすることができます
addAll
学生のマークを のマークにSet
合わせて、セットのサイズが元のサイズより小さいかどうかを比較することができますList
/ Map
.
リストの代わりにマップを使用する必要があると思います