我有以下程序,该程序查找数组“ a”,然后在出现频率最高的数组中输出值。但是,我要实现的另一个条件是,在平局中,两个不同的值出现相等的时间,则输出最低的值。
因此,下面的代码带有数组:
int a[] = {34, 34, 20, 20, 15};
它输出34,但是我希望它输出20,因为这是一个较低的值,在数组中出现的次数也一样。
public class Arrays3 {
public static void main(String[] args){
int a[] = {34, 34, 20, 20, 15};
mode(a);
}
public static int mode(int[] a) {
int[] counts = new int[101];
int maxCount = 0;
int maxKey = 0;
for(int i = 0; i < a.length; i++) {
counts[a[i]]++;
if(counts[a[i]] > maxCount) {
maxCount = counts[a[i]];
maxKey = a[i];
}
}
System.out.println(maxKey);
return maxKey;
}
}
答案 0 :(得分:2)
您可以对照maxKey
进行检查,然后执行以下操作:
if(counts[a[i]] == maxCount && counts[a[i]] < maxKey) {
maxKey = counts[a[i]];
}
因此,如果有平局,maxKey
将设置为较小的元素。然后,如果count[a[i]]
大于maxCount
,maxKey
将被覆盖并成为最常出现的元素:
for(int i = 0; i < a.length; i++) {
counts[a[i]]++;
if(counts[a[i]] > maxCount) {
maxCount = counts[a[i]];
maxKey = a[i];
}
if(counts[a[i]] == maxCount && counts[a[i]] < maxKey) {
maxKey = a[i];
}
}
System.out.println(a[maxKey]);
输出
20
答案 1 :(得分:2)
一个有趣的解决方案(我写得很有趣)是,首先通过流传输数组并将Map
与Collectors.groupingBy
一起使用来创建频率Collectors.counting()
。
然后,我们可以流式传输并再次使用Collectors.groupingBy
创建一个Map<Long, SortedSet<Integer>>
(键是频率,值是具有该频率的数组中值的排序集合)。
最后,我们可以对Map
进行排序,以使频率最高,然后从SortedSet
中获取最低的元素:
int[] a = {34, 34, 20, 20, 15};
var lowest = Arrays.stream(a)
.boxed()
.collect(Collectors.groupingBy(Function.identity(), Collectors.counting()))
.entrySet()
.stream()
.collect(Collectors.groupingBy(Map.Entry::getValue,
Collectors.mapping(Map.Entry::getKey, Collectors.toCollection(TreeSet::new))))
.entrySet()
.stream()
.sorted(Comparator.comparing(Map.Entry::getKey, Comparator.reverseOrder()))
.map(Map.Entry::getValue)
.mapToInt(TreeSet::first)
.findFirst();
lowest.ifPresent(System.out::println);
输出:
20
答案 2 :(得分:0)
int maxKey = Integer.MAX_VALUE;
然后,每次找到更好的计数,我们都必须进行比较以更新maxKey 毕竟,解决方案看起来像这样
int[] counts = new int[101];
int maxCount = 0;
int maxKey = Integer.MAX_VALUE;
for(int i = 0; i < a.length; i++) {
counts[a[i]]++;
if(counts[a[i]] >= maxCount) {
maxCount = counts[a[i]];
if(a[i] < maxKey) maxKey = a[i];
}
}
System.out.println(maxKey);
return maxKey;
编码有趣