gpt4 book ai didi

java - 查找数组中频率最高的所有数字?

转载 作者:搜寻专家 更新时间:2023-11-01 01:20:24 25 4
gpt4 key购买 nike

我正在尝试找出频率最高的所有数字。即,如果最大频率为 5,则我需要在数组中出现 5 次的所有数字。

让我们考虑以下数组示例:

1 8 7 8 9 2 1 9 6 4 3 5

在这里,出现频率最高的数字是 8、1、9,频率最高的是 2。我的预期输出是这样的:

8 => 2
1 => 2
9 => 2

在我的项目中,我试图找出出现频率最高的数字和出现频率最低的数字。在这里,我只想要最常见的数字。

我生成了 1000 个类似于我的项目场景的随机数,并计算了不同的数字,然后计算了它们的出现。

    int n=100;
int N=1000;

int data[] = new int[N];
Set<Integer> set = new HashSet<Integer>();

Random random = new Random();

for(int i=0;i<N;i++){
int number = random.nextInt(n);
data[i] = number;
set.add(number);
}

int frequency[] = new int[set.size()];
Integer[] distinct = set.toArray(new Integer[set.size()]);

for (int j=0;j<set.size();j++){
int count=0;
for(int k=0;k<N;k++){
if(distinct[j]==data[k]){
count = count+1;
}
}
frequency[j] = count;
}

在计算了每个数字的频率后,我使用来自 here 的答案计算了频率最高的数字这是优化的。

    int max = Integer.MIN_VALUE;
List<Integer> vals = new ArrayList<>();

for (int q=0; q < frequency.length; ++q) {

if (frequency[q] == max) {
vals.add(q);
}

else if (frequency[q] > max) {
vals.clear();
vals.add(q);
max = frequency[q];
}
}

for(int num : vals){
System.out.println(distinct[num]+" => "+frequency[num]);
}

在这里,循环第一个代码使整个过程变慢。这只是大型代码和示例测试用例的一部分。

我想让这个过程更快,因为在实际情况下数组中可能有大元素。

谁有办法优化这些循环? 或者一些其他方式来获得结果?

感谢任何形式的帮助。

最佳答案

我会为此使用流。它并没有变得更短,但是一旦您熟悉了流,它在概念上就会更简单。

    Map<Integer, Long> frequencies = Arrays.stream(data)
.boxed()
.collect(Collectors.groupingBy(i -> i, Collectors.counting()));
if (frequencies.isEmpty()) {
System.out.println("No data");
} else {
long topFrequency = frequencies.values()
.stream()
.max(Long::compareTo)
.get();
int[] topNumbers = frequencies.entrySet()
.stream()
.filter(e -> e.getValue() == topFrequency)
.mapToInt(Map.Entry::getKey)
.toArray();
for (int number : topNumbers) {
System.out.println("" + number + " => " + topFrequency);
}
}

使用问题中的示例数据打印所需的(仅以另一种不可预测的顺序):

1 => 2
8 => 2
9 => 2

编辑:tucuxi 问:为什么不使用流打印呢?当然,您可以这样做,以获得更短但更简单的代码:

        frequencies.entrySet()
.stream()
.filter(e -> e.getValue() == topFrequency)
.mapToInt(Map.Entry::getKey)
.forEach(n -> System.out.println("" + n + " => " + topFrequency));

选择什么取决于需求和品味。我原以为 OP 需要存储最高频率的数字,所以我演示了如何做到这一点,并打印它们以显示结果。还有一些人认为流应该没有副作用,我认为打印到标准输出是一种副作用。但如果您愿意,请使用它。

关于java - 查找数组中频率最高的所有数字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44352655/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com