Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/314.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 - Fatal编程技术网

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

Java 如何计算数组/列表中特定元素的出现次数,java,Java,我是java新手,正在用java开发一个小应用程序,现在我陷入了困境。我有一个名为Candidate的自定义类。它看起来像: ============================= |Candidate Class | ============================= |Private Members: | |Node Array | |IsValid Bool | -------

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

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

现在我有一个数组,包含所有候选对象的列表,我想知道数组中每个候选对象的出现频率。我想到的一种方法是编写两个循环,并使用重载方法进行比较。但我不想用这个。所以我只想确认一下,有没有任何内置的方法可以为我做同样的事情?

这是一个经典的问题。解决方案是使用一个映射,其中键是数组中的项,值是计数

psuedocode中接近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);
    }
}
Map Map=newhashmap();
(候选人c:候选人){
if(图c){
map.put(c,map.get(c)+1);
}否则{
图.put(c,1);
}
}

运行此操作后,计数将出现在地图中。

我想除了在
数组列表中循环之外,没有其他方法

我将向您展示我很久以前为该场景编写的一种简单方法:)

假设您已经为
Candidate
类实现了
hashcode()
equals()
函数

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 );
    }
}
HashMap计数器=新的HashMap();
for(候选can:andidateArray){
if(counter.get(can)==null){
计数器。放置(罐,1);
}否则{
counter.put(can,counter.get(can)+1);
}
}

如果要查找特定元素的频率,有一种更简单的方法:

final String[] fruits = { "apple", "orange", "pear", "apple" };
final List<String> fruitList = Arrays.asList(fruits);
System.out.println(Collections.frequency(fruitList, "apple")); // Prints 2
final String[]fruits={“apple”、“orange”、“pear”、“apple”};
最终列表水果列表=Arrays.asList(水果);
System.out.println(Collections.frequency(水果列表,“苹果”);//印刷品2
您可以使用:

Multiset counter=HashMultiset.create(Arrays.asList(“apple”、“apple”、“orange”);

Collection类中的这个API对我来说是新的。谢谢分享
Multiset<String> counter = HashMultiset.create(Arrays.asList("apple","apple","orange"));