新手java程序员,对数组不熟悉,正在分配以下提示:
编写一个程序,绘制测试分数的等级分布。每次输入一个分数,并且当输入分数0(零)时循环将中断。输出将为字母等级中的每个分数打印*,并将字母等级放在图表下方的水平轴上。
我的主要问题是创建一个数组,使我能够总结每个年级(A,B,C ......)的分数。我禁止在此转换中使用if或switch语句。我想知道从哪里开始创建这个数组。谢谢!
答案 0 :(得分:1)
它必须是一个数组吗?如果没有,Map是这种情况的不错选择。地图的键是各种等级(A,B,C等),每个键的值是一个整数(或长),用于保存该键的等级数。因此,基本逻辑是从地图中获取等级(即键)的计数器,将其递增并将其放回地图中。
如果您不介意使用外部库,那么Guava's Multiset更适合。
编辑:好的,所以你需要使用一个数组,但是一个挑战(如果我正确地读你的帖子)是你不能使用if或switch语句(可能是为了访问数组)。一种可能的方法是将'A'分配给索引0,将'B'分配给索引1等。然后,您可以使用以下表示法进行数组索引:
char gradeAsChar = ...; //I'll leave this to you to get the grade as an (uppercase) char
gradesArray[gradeAsChar - 'A'] = gradesArray[gradeAsChar - 'A'] + 1;
'A' - 'A'是0,'B' - 'A'是1,等等。当然,如果角色出乎意料,上面的索引越界越来越成熟,所以你需要一些那里的错误处理。
答案 1 :(得分:1)
当然,如果你不关心内存效率(编码时你总是应该这么做!),你可以制作一个新的数组:
int[] grades = new int[101];
然后,只要用户输入输入,您就可以执行以下操作:
int grade = input.nextInt();
grades[grade] = grades[grade] + 1;
您可以通过运行以下内容来计算出等于A的等级数:
int A = 0;
for (int i = 91; i < 101; i++){
A += grades[i];
}
当你说你不允许使用if或switch语句时,我就是这么想的。如果有帮助,请告诉我。再次,非常低效,但至少你跟踪你拥有的所有分数。这是一个加分。
这应该是O(n)的粗略运行时,但我认为可能更好。
祝你好运!编辑:您可以使用整数除法的概念来执行上述方法的更高效版本。什么是整数除法你可能会问,当你除了两个整数,比如说10/3,答案可能是3.333,但是java丢弃了小数部分,所以答案是3。 因此,如果除以10,则可以使用结果来获得哪些分数为A,依此类推。例如:92/10 = 9,97 / 10 = 9,83 / 10 = 8等。需要注意的是,A的得分为91-100,因此在应用此概念之前必须减去1。
这应该将数组从101个元素减少到10个,因为你只跟踪数字中的数字,这无论如何更重要。你或许可以进一步优化这一点,但这不是我的功课,所以我不想花太多时间在上面。我醒来时想到了这一点:)。
希望这给了你一些思考的食物!