我知道
Collections.frequency(obj1,obj2);
给我对象 obj2 在集合 obj1 中存在的次数。但我想问说 obj1 是一个由对象(学生)组成的集合(列表)。
一个学生可以有 {name,marks}
那么是否有任何可能的单线或两线方式可以让我找到得分相同的学生人数
我不希望包含任何额外的库
我知道
Collections.frequency(obj1,obj2);
给我对象 obj2 在集合 obj1 中存在的次数。但我想问说 obj1 是一个由对象(学生)组成的集合(列表)。
一个学生可以有 {name,marks}
那么是否有任何可能的单线或两线方式可以让我找到得分相同的学生人数
我不希望包含任何额外的库
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
方法来表示相同的分数 == 相同的学生,你可以使用 Map 来实现你想要的我的想法。您必须进行更多设置,但检索应该是 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
(或等效的)传递给该Collections.frequency
方法会很好 - 如果可以的话,您可以获得两全其美的效果。你不能,你可以将上面的代码包装到你自己的frequency
方法中
我认为您需要使用 Map 而不是 List
您可以addAll
将学生的分数设置为 a Set
of 分数,然后比较该集合的大小是否小于原始List
/的大小Map
。