Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/398.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在java中查找对象集合内部的频率_Java_List_Collections - Fatal编程技术网

在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