我正在开发一个关于Hashmaps的初学Java教程,并提供了以下任务
// Create a method called printOccurrences(int[] scores)
//
// HINT: Use a HashMap to keep track of the counts (K: Integer, V: Integer)
// For int[] scores = {85,93,96,96,92,100,91,85,87,92}
// Desired Output Is:
// 85 - 2
// 87 - 1
// 92 - 2
// 93 - 1
// 96 - 2
// 100 - 1
//
以下是我的代码
import java.util.HashMap;
public class Ex5_NumberOfOccurrences {
public static void main(String[] args) {
int[] scores = {85,93,96,96,92,100,91,85,87,92};
printOccurrences(scores);
}
public static void printOccurrences (int[] scores){
HashMap <Integer, Integer> tracker = new HashMap<Integer, Integer>();
for (int i = 0; i < scores.length; i++){
int count = 0;
for (int j = 0; j< scores.length; j++){
if (scores [i] == scores[j]){
count ++;
}
}
tracker.put(scores[i], count);
System.out.println( scores[i] + "-" + tracker.get(scores[i]));
}
}
}
代码运行,但我的输出有重复值,如下所示。
85-2
93-1
96-2
96-2
92-2
100-1
91-1
85-2
87-1
92-2
有谁知道如何避免重复的输出值?
答案 0 :(得分:1)
在每次迭代时打印跟踪器输出,这会导致重复输出。 HashMap
存储了正确的值。
您可以尝试(在for
循环之外):
for (int key : tracker.keySet())
System.out.println(key + "-" + tracker.get(key));
此外,您可以使用for
(tracker
)代替使用多个HashMap
循环来跟踪:
for (int score : scores) {
if (tracker.constainsKey(score))
tracker.put(score, tracker.get(score) + 1);
else
tracker.put(score, 1); //Init for each score
答案 1 :(得分:0)
由于println位于外部for循环中,因此每次在score数组中点击值时都会打印结果。
我认为更多的是问题的精神,试着像这样重写:
for each score -
if the map has the score key -
pull the value out of the map and increment it, return it to the map
else
insert into the map (key, 1)
不同之处在于,这将为您提供线性性能而不是二次性(即此版本将在时间上与输入数组的长度成比例,因为您只扫描数组一次,而您的版本将运行时间与数组长度的平方成正比。)