java - 计算 arrayList 中的频率

标签 java

下面的代码运行良好,但我想添加一个方法来计算数组列表中整数的频率。例如:90-99 频率:3.... 80-89 频率 6

最好的方法是什么?我应该做一个 if 语句来计算++ 每个变量吗?

import java.io.*;
import java.lang.Math;
import java.util.*;
import java.text.DecimalFormat;

public class gradeSorter{

public static void main(String[] args) throws IOException {
{
DecimalFormat fmt = new DecimalFormat("0.000");
Scanner scanner = new Scanner(new File("grades.dat"));
double average;
double deviation;
double sum = 0;
int number = 0;
int newnumber = 0;
ArrayList<Integer> element = new ArrayList<Integer>();



while (scanner.hasNextInt())
{
element.add(scanner.nextInt());


}
for (int item : element){
        sum += item;
        System.out.println(item);
}

average = sum / element.size();

for (int i = 0; i < element.size(); i++)
{ 
newnumber += Math.pow((element.get(i) - average),2);

}


deviation = Math.sqrt(newnumber / (element.size()));




System.out.println("The average of these grades is : " + fmt.format(average));

System.out.println("The standard deviation of these grades is: " + fmt.format(deviation));  


}
}
}

----jGRASP exec: java gradeSorter

51
52
55
57
58
61
62
63
66
66
66
70
72
73
74
75
75
77
77
78
79
81
82
84
86
87
88
91
94
97
The average of these grades is : 73.233
The standard deviation of these grades is: 12.288

 ----jGRASP: operation complete.

最佳答案

首先使用一个与您期望的最大值一样大的整数数组。由于这看起来像成绩,也许我们可以假设您将获得的最大值是 100?如果是这样,这样的代码就可以工作。

int[] freqMap = new int[100];
for(int i=0;i<list.size();i++){
    int indexValue = list.get(i);
    freqMap[indexValue]++;
}

看看这个,想一想。因此,当等级为 3 时,我们获取第 3 个索引处的值,并将其递增。如果这种情况发生 10 次,我们频率数组中的前 4 值将如下所示:

0 0 0 10

这是因为数组是从 0 开始索引的。这里索引 3 的频率是 10。

编辑:

迭代结构以获得特定范围的频率。这是微不足道的。我将在这里演示:

//the frequency aggregate for the range 80-90
int freqFor80To90 = 0;
for(int i=80; i<90; i++){
    freqFor80To90+=freqMap[i];
}
System.out.println("The frequency for 80-90 is "+freqFor80To90);

存储所有数字的频率在堆方面稍微昂贵一些,但与使用原始数据集计算整个范围的频率相比,您可以更快地查询许多不同的范围。

我提供的解决方案为您提供了一个结构 freqMap,用于查询频率范围。这就是我在上面的代码示例中所做的;查询特定范围频率的结构。

其他解决方案为您提供包含整个范围频率的数组,这是完全有效的。然而,我的解决方案提供了更大的灵 active ,因为它以稍微多一点内存为代价提供了原始数据集的更精细 View 。

关于java - 计算 arrayList 中的频率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18113420/

相关文章:

java - 有没有办法将其转换为 "while loop"或 "do while loop"?

java - Gradle 1.12 缓存

java - 如何从组合 boolean 值中获取十六进制值?

java - SQL语法异常 : could not execute query

java - Spark Web 框架单元测试

java - 为什么 ArrayList RandomAccess 而 ArrayDeque 不是?

java - JNI/ Kotlin : Is it possible to pass delegate to JNI?

java - Hive的Presto连接问题:读取超时异常

java - 未找到 JPype 类

java - 有任何方法可以检测 jfreechart 绘图/图表何时失去焦点