在数组中查找模态编号

时间:2014-10-07 23:18:56

标签: java arrays topmost

我有这样的数组:

int[] array = { 2, 4, 6, 8, -3, 8, 2, 7, 2, 4 };

我想知道哪个号码显示的时间最多(当然这是2号),我该怎么做?

6 个答案:

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

  1. 先排序
  2. 现在进入循环,查看号码是否重复
  3. 如果是,则计算重复的次数并存储其详细信息。
  4. 在整个循环中做同样的事情。如果任何其他号码有更多计数,只需用新号码替换您存储的详细信息。您可以将数字和计数等详细信息存储在单独的变量中。