如何计算数组/列表中特定元素的出现次数

时间:2011-07-25 06:41:00

标签: java

我是java新手并在java中开发一个小应用程序,现在我陷入了困境。我有一个名为Candidate的自定义类。它看起来像:

=============================
|Candidate Class            |
=============================
|Private Members:           |
|Node Array                 |
|IsValid Bool               |
-----------------------------
|Public Methods:            |
|AddCandidateNode           |
|SetIsValid                 |
|ComparisonOperatorOverloaded|
=============================

现在我有一个包含所有候选者列表的数组,我想知道该数组中每个候选者的出现频率。我想到的一种方法是编写两个循环并使用重载方法进行比较。但我不想用它。所以我只想要符合那种内置方法对我做同样的事情吗?

4 个答案:

答案 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)

您可以使用guava's MultiSet

Multiset<String> counter = HashMultiset.create(Arrays.asList("apple","apple","orange"));
相关问题