我有这样的数组:
int[] array = { 2, 4, 6, 8, -3, 8, 2, 7, 2, 4 };
我想知道哪个号码显示的时间最多(当然这是2号),我该怎么做?
答案 0 :(得分:2)
我想下面的代码将在Java 8中实现。
int[] array = { 2, 4, 6, 8, -3, 8, 2, 7, 2, 4 };
Arrays.stream(array).collect(Collectors.groupingBy(s -> s))
.forEach((k, v) -> System.out.println(k + ": " + v.size()));
打印:
2: 3
4: 2
8: 2
6: 1
7: 1
-3: 1
答案 1 :(得分:1)
你可以做这样的算法:
Map<Integer, Integer> frequencies = new HashMap<>();
for (int n : array) {
frequencies.put(n, frequencies.getOrDefault(n, 0) + 1); // Java 8
}
if (!frequencies.isEmpty()) {
Integer bestMatch = null;
Integer lastCount = null;
for (Map.Entry<Integer,Integer> entry : frequencies.entrySet()) {
Integer count = entry.getValue();
if (null == lastCount || count > lastCount) {
bestMatch = entry.getKey();
lastCount = count;
}
}
System.out.println("Most frequent value: " + bestMatch + " (found " + lastCount + " times)");
}
答案 2 :(得分:0)
你可以构建一个地图映射到它们的计数。在Java中,类似于HashMap<Integer, Integer>
。浏览列表并检查int是否已在地图中。如果是,则将其计数加1,否则将其初始化为1.然后,返回地图并找到计数最高的数字。
答案 3 :(得分:0)
您需要创建频率分布并遍历数组。当你使用整数时,这很容易,因为它们可以直接用作键。
HashTable frequencyDistribution = new HashTable();
for(int i=0; i<array.length; i++) {
int key = array[i];
if( !frequencyDistribution.containsKey( key ) ) frequencyDistribution.add( key, 0 );
frequencyDistribution[ key ]++;
}
int modeKey;
int modeCnt = int.MIN;
foreach(int key in frequencyDistribution.keys) {
int cnt = frequencyDistribution[key];
if( cnt > modeCnt ) modeKey = key;
}
print("Most frequent is: {0} as it appears {1} times.", modeKey, modeCnt);
答案 4 :(得分:0)
您可以使用存储桶排序的存储桶填充步骤,然后线性扫描所有存储桶以获得最常出现的数字(您知道如何获取数组中的最大数量,对吧?)。底层数据结构不必是一个数组(这是最快的),你可以使用任何有密钥的数据 - &gt;值机制,因为对于BIG范围,由于内存约束,可能无法使用数组,但运行时间较慢。
答案 5 :(得分:0)