在java中查找对象集合内部的频率
我知道这件事在java中查找对象集合内部的频率,java,list,collections,Java,List,Collections,我知道这件事 Collections.frequency(obj1,obj2); 提供对象obj2在集合obj1中存在的次数。 但是我想问一下,obj1是一个由对象(student)组成的集合(列表) 学生可以有{name,marks} 那么有没有可能的单行或两行的方式,让我找出得分相同的学生人数 我不希望包含任何额外的库我认为您需要使用Map而不是List我认为您需要使用Map而不是List集合。frequency返回指定集合中与指定对象相等的元素数。它基本上等于obj2与列表对象 如果
Collections.frequency(obj1,obj2);
提供对象obj2在集合obj1中存在的次数。
但是我想问一下,obj1是一个由对象(student)组成的集合(列表)
学生可以有{name,marks}
那么有没有可能的单行或两行的方式,让我找出得分相同的学生人数
我不希望包含任何额外的库我认为您需要使用Map而不是List我认为您需要使用Map而不是List
集合。frequency
返回指定集合中与指定对象相等的元素数。它基本上等于obj2与列表对象
如果重写equals
方法并根据分数属性将逻辑设置为like,则对象将等于或不等于。然后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;
}
}
Collection.frequency
返回指定集合中与指定对象相等的元素数。它基本上等于obj2与列表对象
如果重写equals
方法并根据分数属性将逻辑设置为like,则对象将等于或不等于。然后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;
}
}
您可以
将所有学生的分数添加到一组分数中,然后比较该组分数的大小是否小于原始列表的大小/映射您可以将所有学生的分数添加到一组分数中,然后比较如果集合的大小小于原始列表的大小
/映射
如果你不愿意改变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;
//设置/填充
Map Map=newhashmap();
用于(学生:学生){
List studentsForScore=new ArrayList();
if(map.containsKey(student.getScore())){
studentsForScore=map.get(student.getScore());
}
studentsForScore.add(student);
map.put(student.getScore(),studentsForScore);
}
//信息检索
学生测试学生=。。。
int numberOfStudentsWithSameScore=map.containsKey(testStudent.getScore())?map.get(testStudent.getScore()).size():0;
这当然假设您愿意接受设置块的成本
最好是能够将比较器
(或等效物)传递到Collections.frequency
方法中-如果可以,您可以充分利用这两个方面。如果你不愿意改变你的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;
//设置/填充
Map Map=newhashmap();
用于(学生:学生){
List studentsForScore=new ArrayList();
if(map.containsKey(student.getScore())){
studentsForScore=map.get(student.getScore());
}
studentsForScore.add(student);
map.put(student.getScore(),studentsForScore);
}
//信息检索
学生测试学生=。。。
int numberOfStudentsWithSameScore=map.containsKey(testStudent.getScore())?map.get(testStudent.getScore()).size():0;
这当然假设您愿意接受设置块的成本
最好是能够将比较器
(或等效物)传递到Collections.frequency
方法中-如果可以,您可以充分利用这两个方面。因为你不能,你可以把上面的代码包装成你自己的frequency
method我想你不明白我的问题…请先看看收集频率(java)我想你不明白我的问题…请先看看收集频率(java)当你说“得分相同的学生人数”时,你的意思是你想知道所有取得某个分数的学生人数吗?或者有多少学生取得了非唯一的分数?或者不同标记的频率列表?或者什么?你的问题听起来像是一场关于Java有多复杂的咆哮的前奏(请注意,我不想暗示这一点)。“我想做一些可能不太常见的事情,没有自己的10行集合框架方法,我想做两行,我不想让任何其他库来做。”那么,我想是“选择任意两行”。@chm052。。所有学生都取得特定成绩的人数mark@arne.b我的意思是1)——我希望答案足够简单,这样看起来就不会像火箭科学的解决方案。因为上面的问题可以通过多种方式解决,但我要求的是最简单的解决方案(如果可能的话)2)因为我正在进行的项目不允许我添加额外的库。3) 我们有一个解决方案,但我发现这不是最好的解决方案,这就是为什么我问这个问题。当你说“得分相同的学生人数”时,我希望我能够解释我的问题的原因,你的意思是你想要所有得分相同的学生人数吗?或者有多少学生取得了非唯一的分数?或者不同标记的频率列表?或者什么?你的问题听起来像是一场关于Java有多复杂的咆哮的前奏(请注意,我不想暗示这一点)。“我想做一些可能不太常见的事情,没有自己的10行集合框架方法,我想分两行来做,我不想让任何其他库来做。”那么,我想是“选择任意两行”。@ch