【问题标题】:finding Frequency inside the object Collections in java在java中的对象集合中查找频率
【发布时间】:2013-02-25 18:05:39
【问题描述】:

我知道

Collections.frequency(obj1,obj2);  

给出对象 obj2 在集合 obj1 中存在的次数。 但我想问一下 obj1 是一个由对象(学生)组成的集合(列表)。

一个学生可以有 {name,marks}

那么是否有任何可能的单行或两行方法可以让我找到得分相同的学生人数

我不希望包含任何额外的库

【问题讨论】:

  • 当您说“获得相同分数的学生人数”时,您的意思是您想要获得特定分数的学生人数吗?或者获得非唯一分数的学生人数?或者不同标记的频率列表?还是什么?
  • 您的问题听起来可能是关于 Java 有多复杂的咆哮(请注意,我不想暗示它是)的前奏。 “我想做一些可能不够常见的事情,以拥有自己的 10 行 Collections 框架方法,我想分两行来做,我不希望它由任何其他库来完成。”好吧,我猜是“选择任何两个”。
  • @chm052.. 获得特定分数的学生人数
  • @arne.b 我的意思是 1)---我希望答案足够简单,以免它看起来像火箭科学解决方案。因为上述问题可以通过多种方式解决,但我要求的是最简单的解决方案(如果可能的话) 2)由于我正在从事的项目不允许我添加额外的库。 3)我们有一个解决方案,但我发现这不是最好的解决方案,这就是我问这个问题的原因。我希望我能够解释我的问题的原因

标签: java list collections


【解决方案1】:

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);  

【讨论】:

  • 我的忧虑 1)如果我必须重写 equals 方法,那么我也必须重写 hashCode 方法(有效的 java)。 2)在上述问题的上下文中,如果我重写 equals 方法,那么我要说的是,如果两个学生的分数相等,那么他们也相等:O。我希望你能理解我的担忧。
  • yap 建议使用它,因为它用于HashMapHashSet,无论何时使用此散列,它都使用Link
【解决方案2】:

如果您不愿意更改 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方法中

【讨论】:

    【解决方案3】:

    我认为你需要使用 Map 而不是 List

    【讨论】:

    • 我猜你没有理解我的问题...请先看看 Collections(java) 的频率
    【解决方案4】:

    您可以将学生的分数addAll 换成Set 的分数,然后比较该集合的大小是否小于原始List / Map 的大小。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-12-21
      • 1970-01-01
      • 2013-08-23
      • 2015-04-16
      • 1970-01-01
      • 2015-08-25
      • 1970-01-01
      相关资源
      最近更新 更多