Java:计算Java数组中的出现次数

Java:计算Java数组中的出现次数,java,Java,任务(不是家庭作业):编写一个程序,读取未指定数量的分数,并确定有多少分数高于或等于平均值,有多少分数低于平均值 问题:我在试图计算输入分数的出现次数时,一直在获取数组索引越界错误。将感谢您对如何改进事件输出的指导 import java.util.Scanner; public class AnalyseScore { public static void main(String[] args) { Scanner input =new Scanner(System

任务(不是家庭作业):编写一个程序,读取未指定数量的分数,并确定有多少分数高于或等于平均值,有多少分数低于平均值 问题:我在试图计算输入分数的出现次数时,一直在获取数组索引越界错误。将感谢您对如何改进事件输出的指导

  import java.util.Scanner;
  public class AnalyseScore {
    public static void main(String[] args) {
      Scanner input =new Scanner(System.in);
      System.out.println("Enter the number of students:");
      int studentnumber = input.nextInt();
      //creat  array
      int [] scores =new int[studentnumber];
      int sum =0;


     System.out.println("Enter the student scores:");
     for(int i =0; i<scores.length;i++){
         scores[i]= input.nextInt(); 
        }
     //calculate the  sum  and  the average

     double average;
     for(int i =0; i<scores.length;i++){
        sum +=scores[i];
        }
        average = sum/studentnumber;     

    System.out.println("The  average is:" + (int)(average*100)/100.0);
        int belowavg=0;
        int aboveavg=0;
        for(int i=0;i<scores.length;i++){
        if (scores[i]>average)
            aboveavg++;
        else
            belowavg++;
        }
    System.out.println(" the  number of  scores bove the  average:"+ aboveavg);
    System.out.println("the  number of  scores below  average:" + belowavg);
     int [] count= new int[scores.length];
     for( int i=0;i<scores.length;i++){
        count[scores[i]]++;

    System.out.println(scores[i] + "occured" + count[i]);
}
  }
  }
import java.util.Scanner;
公共类分析核心{
公共静态void main(字符串[]args){
扫描仪输入=新扫描仪(System.in);
System.out.println(“输入学生人数:”);
int studentnumber=input.nextInt();
//创建数组
int[]分数=新int[studentnumber];
整数和=0;
System.out.println(“输入学生分数:”);

对于(int i=0;i在最后一步之前,您的代码看起来很好。您试图计算每个分数的出现次数,但这要求
count
数组的长度为最大分数(这在空间上效率很低)事实上,你并没有生成<代码>计数>代码,因此你的错误。考虑使用<代码> HashMap <代码>而不是一个数组来计数。这个图中的键是分数,值是发生次数:

HashMap<Integer, Integer> count = new HashMap<>();
for(int i=0;i<scores.length;i++){
   if(! count.containsKey(scores[i]) count.put(scores[i], 1); //New score, has been seen once
   else count.put(scores[i], count.get(scores[i]) + 1); //Already seen score, inc count.
}
HashMap count=newhashmap();

对于(int i=0;icount的长度等于score的长度。您得到了一个错误,因为最高分数高于score的长度。

count[scores[i]+;
让我担心。如果
scores[i]=9999999
会发生什么?哪一行生成异常?(@Mshnik-这不是什么大问题。没有人有时间输入100000000个数字。)
average=sum/studentnumber
厌倦整数division@TedHopp不是在有9999999个分数的情况下,而是在单个分数的值为9999999的情况下。如果使用Java 8,则可以使用int sum=IntStream.of优化int数组的和(分数)和;谢谢你的修改。事实上,我正在参加一个自学计划,我还没有学会map、Hashmap和treemap的用法。我知道我会有时间到达那里。但是如果不使用map,就无法重新构造代码并仍然获得所需的结果吗output@pumpin26添加了排序和计数方法以避免映射
if (scores.length > 0) {
    Arrays.sort(scores);
    int count = 1;
    int prevscore = scores[0];
    for (int i = 1; i <scores.length; ++i) { 
        if (scores[i] == prevscore) {
             ++count;
        } else {
             System.out.println(prevscore + " occured " + count);
             count = 1;
             prevscore = scores[i];
        }
    }
    System.out.println(prevscore + " occured " + count);
}
HashMap<Integer, Integer> count = new HashMap<>();
for(int i=0;i<scores.length;i++){
   if(! count.containsKey(scores[i]) count.put(scores[i], 1); //New score, has been seen once
   else count.put(scores[i], count.get(scores[i]) + 1); //Already seen score, inc count.
}