我是java新手并在java中开发一个小应用程序,现在我陷入了困境。我有一个名为Candidate的自定义类。它看起来像:
=============================
|Candidate Class |
=============================
|Private Members: |
|Node Array |
|IsValid Bool |
-----------------------------
|Public Methods: |
|AddCandidateNode |
|SetIsValid |
|ComparisonOperatorOverloaded|
=============================
现在我有一个包含所有候选者列表的数组,我想知道该数组中每个候选者的出现频率。我想到的一种方法是编写两个循环并使用重载方法进行比较。但我不想用它。所以我只想要符合那种内置方法对我做同样的事情吗?
答案 0 :(得分:7)
这是一个经典问题。解决方案是使用一个映射,其中键是数组中的项,值是计数。
psuedocode-close-to-Java中的代码如下所示:
Map<Candidate, Integer> map = new HashMap<Candidate, Integer>();
for (Candidate c: Candidates) {
if (map.containsKey(c)) {
map.put(c, map.get(c) + 1);
} else {
map.put(c, 1);
}
}
运行此计数后,计数将显示在地图中。
答案 1 :(得分:3)
如果您正在寻找特定元素的频率,有一种更简单的方法:
final String[] fruits = { "apple", "orange", "pear", "apple" };
final List<String> fruitList = Arrays.asList(fruits);
System.out.println(Collections.frequency(fruitList, "apple")); // Prints 2
答案 2 :(得分:1)
我想除了循环ArrayList
之外没有其他方法。
我将向您展示我很久以前为该场景写过的一种简单方法:)
假设您已为hashcode()
类实施了equals()
和Candidate
函数。
HashMap<Candidate,Integer> counter = new HashMap<Candidate,Integer>();
for( Candidate can : andidateArray ){
if(counter.get(can) == null){
counter.put(can,1);
}else{
counter.put( can, counter.get(can) + 1 );
}
}
答案 3 :(得分:0)