【发布时间】:2021-05-17 22:06:11
【问题描述】:
我无法正确显示 ArrayList 中的所有模式。在程序中,用户输入等级,您必须找到模式并适应多模式数据集。 这就是我到目前为止所拥有的。我有一个循环来获取作为模式的等级值并将它们放在模式列表中,但是当我打印它时,它会一遍又一遍地打印它们,而不是一次只打印一个数字。此外,我们必须使用 ArrayList,所以它是动态的。感谢任何帮助!
public static void getMode(ArrayList <Integer> grades) {
ArrayList <Integer> modes= new ArrayList<>();
int maxCount = 0;
for (int c = 0; c<grades.size(); c++) {
int counter = 0;
for(int i = 0; i<grades.size(); i++) {
if(grades.get(i) == grades.get(c)) { counter++; }
if(counter > maxCount) {
maxCount = counter;
modes.clear();
modes.add(grades.get(c));
}
else if(counter==maxCount) {
modes.add(grades.get(c));
}
}
}
for(int c = 0; c<grades.size(); c++) {
System.out.println(modes.get(c));
}
}
输出(如果模式为 89,76):
89
89
76
76
76
76
【问题讨论】:
-
这里你有一个 O(n^2) 算法来计算,对于列表中的每个年级,它发生了多少次。但是,如果说 1 级出现十次,那么您将把它算作十次出现中的每一次的模式。更明智的方法是建立一个哈希表,计算每个年级,然后寻找最频繁的。如果成绩是已知范围内的整数,你甚至不需要哈希表,数组就可以了(这就像计数排序)。
-
谢谢,我们不允许对这个问题使用哈希表,也不能只使用数组列表
-
请添加您预期的输入和输出以进行澄清。此外,modes.clear() 的目的还不清楚。以及为什么要使用 last Grades.size() 来迭代最终的 for 循环?
-
@Md.KawserHabib
modes.clear()的目的只是在找到更频繁的成绩时删除所有以前“已知”的模式,因为它是新模式。 -
一种可能性:算法仍然很差,但是如果你在
c而不是0开始内循环,那么至少模式只会出现一次:随后的尝试将“看到" 出现次数较少,因此它们不会被捕获为模式。关于我之前的评论,请注意,使用数组列表而不是数组绝对不是问题,您只需要确保成绩在(最好是小的)固定范围内。