Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/384.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在arrayList中计算频率_Java - Fatal编程技术网

Java 在arrayList中计算频率

Java 在arrayList中计算频率,java,Java,下面的代码运行良好,但我想添加一个方法来计算arraylist中整数的频率。例如: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)

下面的代码运行良好,但我想添加一个方法来计算arraylist中整数的频率。例如: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));  


}
}
}

首先使用一个与期望的最大值一样大的整数数组。因为这看起来像分数,也许我们可以假设你得到的最大值是100?如果是这样的话,这样的代码就可以工作了

int[] freqMap = new int[100];
for(int i=0;i<list.size();i++){
    int indexValue = list.get(i);
    freqMap[indexValue]++;
}
这是因为数组是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);
//80-90范围内的频率聚合
int FREKFOR80到90=0;

对于(int i=80;i来说,首先使用一个与您期望的最大值一样大的整数数组。因为这看起来像是分数,也许我们可以假设您得到的最大值是100?如果是这样,那么这样的代码就可以了

int[] freqMap = new int[100];
for(int i=0;i<list.size();i++){
    int indexValue = list.get(i);
    freqMap[indexValue]++;
}
这是因为数组是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);
//80-90范围内的频率聚合
int FREKFOR80到90=0;

对于(int i=80;i创建一个大小为
10
的数组,该数组保存每个范围内的数字频率:

int[] rangeFrequency = new int[10];
现在,对于范围-
[0,9]
中的所有数字,频率将进入索引0。对于范围
[10,19]
,频率将进入索引1,依此类推

现在的重点是如何获得所有这些范围的索引?以下是方法:

伪代码:

for each element in list
    bucket = element / 10   // For range [0-9], this will give index = 0
                           // For range [10-19], this will give index = 1
    rangeFrequence[bucket] += 1;
int[] rangeFrequency = new int[10];

for (int elem: element) {
    int bucket = elem / 10;
    rangeFrequency[bucket] += 1;
}

// Print frequency from array:
for (int i = 0; i < rangeFrequency.length; ++i) {
    System.out.print("Frequency in range : [" + i * 10 + ", " + 
                                                 (i * 10 + 9) + ") --> ");
    System.out.println(rangeFrequency[i]);
}

代码:

for each element in list
    bucket = element / 10   // For range [0-9], this will give index = 0
                           // For range [10-19], this will give index = 1
    rangeFrequence[bucket] += 1;
int[] rangeFrequency = new int[10];

for (int elem: element) {
    int bucket = elem / 10;
    rangeFrequency[bucket] += 1;
}

// Print frequency from array:
for (int i = 0; i < rangeFrequency.length; ++i) {
    System.out.print("Frequency in range : [" + i * 10 + ", " + 
                                                 (i * 10 + 9) + ") --> ");
    System.out.println(rangeFrequency[i]);
}
int[]rangeFrequency=新的int[10];
for(int元素:元素){
int bucket=elem/10;
范围频率[桶]+=1;
}
//从阵列打印频率:
对于(int i=0;i”;
System.out.println(范围频率[i]);
}

请注意,您需要注意ArrayIndexOutOfBounds,当您的
等级<0 | |等级>=100时,上述程序将崩溃。

创建一个大小为
10
的数组,该数组保存每个范围内的数字频率:

int[] rangeFrequency = new int[10];
现在,对于范围-
[0,9]
中的所有数字,频率将进入索引0。对于范围
[10,19]
,频率将进入索引1,依此类推

现在的重点是如何获得所有这些范围的索引?以下是方法:

伪代码:

for each element in list
    bucket = element / 10   // For range [0-9], this will give index = 0
                           // For range [10-19], this will give index = 1
    rangeFrequence[bucket] += 1;
int[] rangeFrequency = new int[10];

for (int elem: element) {
    int bucket = elem / 10;
    rangeFrequency[bucket] += 1;
}

// Print frequency from array:
for (int i = 0; i < rangeFrequency.length; ++i) {
    System.out.print("Frequency in range : [" + i * 10 + ", " + 
                                                 (i * 10 + 9) + ") --> ");
    System.out.println(rangeFrequency[i]);
}

代码:

for each element in list
    bucket = element / 10   // For range [0-9], this will give index = 0
                           // For range [10-19], this will give index = 1
    rangeFrequence[bucket] += 1;
int[] rangeFrequency = new int[10];

for (int elem: element) {
    int bucket = elem / 10;
    rangeFrequency[bucket] += 1;
}

// Print frequency from array:
for (int i = 0; i < rangeFrequency.length; ++i) {
    System.out.print("Frequency in range : [" + i * 10 + ", " + 
                                                 (i * 10 + 9) + ") --> ");
    System.out.println(rangeFrequency[i]);
}
int[]rangeFrequency=新的int[10];
for(int元素:元素){
int bucket=elem/10;
范围频率[桶]+=1;
}
//从阵列打印频率:
对于(int i=0;i”;
System.out.println(范围频率[i]);
}

请注意,您需要注意ArrayIndexOutOfBounds,当您的
等级<0 | |等级>=100时,上述程序将崩溃。

您可以使用整数数组来实现此目的:

int[] counters = new int[NUMBER_OF_BUCKETS];

while (scanner.hasNextInt()) {
  int n = scanner.nextInt();

  // Determine which bucket this int should be in:
  int bucket = determineBucket(n);

  //Count the integer in the appropriate bucket:
  counters[bucket]++;
}
determineBucket()
方法获取一个数字并决定应该将其计数到哪个存储桶中(一个存储桶只是一组数字,例如,在您的情况下,存储桶的范围是80-89)。对存储桶进行编码的最简单方法如下:

private static int determineBucket(int n) {
  if(80 <= n && n < 90) {
    return 0;
  } else if(90 <= n && n < 100) {
    return 1;
  } else if(...) {
    ...
  }
}
private static int determinatebucket(int n){

如果(80您可以使用整数数组:

int[] counters = new int[NUMBER_OF_BUCKETS];

while (scanner.hasNextInt()) {
  int n = scanner.nextInt();

  // Determine which bucket this int should be in:
  int bucket = determineBucket(n);

  //Count the integer in the appropriate bucket:
  counters[bucket]++;
}
determineBucket()
方法获取一个数字并决定应该将其计数到哪个存储桶中(一个存储桶只是一组数字,例如,在您的情况下,存储桶的范围是80-89)。对存储桶进行编码的最简单方法如下:

private static int determineBucket(int n) {
  if(80 <= n && n < 90) {
    return 0;
  } else if(90 <= n && n < 100) {
    return 1;
  } else if(...) {
    ...
  }
}
private static int determinatebucket(int n){
如果(80见

java.util.Collections具有以下方法:
公共静态整数频率(集合c,对象o)
“返回指定集合中与指定对象相等的元素数。”

请参阅

java.util.Collections具有以下方法:
公共静态整数频率(集合c,对象o)

“返回指定集合中与指定对象相等的元素数。”

是的,让我来编辑…您可以使用整数数组,但它对方差较大的数据不起作用。@James您已经使用了
ArrayList
,所以该学习了;-)@William Morrison,如果你不介意的话,你可以发布int数组方法,这样我就可以看到它是如何完成的。这不会找到范围的频率,而是每个元素的频率。对,Jason和我建议相同的事情,除了我使用的桶大小为1,他使用的桶大小为10。他正在计算一个可以立即容纳你的解的结构,我正在创建一个structure您需要查询解决方案。这是我在回答的最后演示的内容。是的,让我编辑一下……您可以使用整数数组,但它对高方差的数据不起作用。@James您已经使用了
ArrayList
,所以现在是学习的时候了;-)@William Morrison,如果你不介意的话,你可以发布int数组方法,这样我就可以看到它是如何完成的。这不会找到范围的频率,而是每个元素的频率。对,Jason和我建议相同的事情,除了我使用的桶大小为1,他使用的桶大小为10。他正在计算一个可以立即容纳你的解的结构,我正在创建一个struC您需要查询解决方案。这是我在回答末尾演示的。如果所有数字都<100,您可以创建一个
int[100]
并存储每个数字的频率。或一个
int[10]
存储每个x0-x9范围。@詹姆斯,不要删除代码。重要的是提供问题和答案的上下文。如果所有数字都<100,你可以创建一个
int[100]