【问题标题】:How do I find multiple modes in a Java ArrayList?如何在 Java ArrayList 中找到多种模式?
【发布时间】: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开始内循环,那么至少模式只会出现一次:随后的尝试将“看到" 出现次数较少,因此它们不会被捕获为模式。关于我之前的评论,请注意,使用数组列表而不是数组绝对不是问题,您只需要确保成绩在(最好是小的)固定范围内。

标签: java algorithm arraylist


【解决方案1】:

如果您想要做的 - 是将每个数字最多打印 1 次 - 那么您必须确保值的唯一性。 有一个 Set 接口保证它将包含唯一的元素。 这是获取给定集合、创建相关集合(以确保数字不重复)并打印所有元素的示例代码

Set<Integer> modes = new HashSet<>(list);
modes.forEach(System.out::println);

【讨论】:

    猜你喜欢
    • 2015-10-30
    • 2012-07-08
    • 2023-03-09
    • 2019-11-21
    • 1970-01-01
    • 2023-01-28
    • 1970-01-01
    • 2019-05-05
    • 2015-11-10
    相关资源
    最近更新 更多