【问题标题】:Get mode value in java在java中获取模式值
【发布时间】:2010-10-17 12:28:57
【问题描述】:

知道如何从数组中获取模式值吗?例如,如果我有一个数字不同的数组,我如何使用 Java 来搜索哪个数字出现的次数最多?

【问题讨论】:

    标签: java


    【解决方案1】:

    在 O(n) 中完成,而不是 O(n^2)。需要长度 > 0 的数组。

    public static int getMode(int[] values) {
      HashMap<Integer,Integer> freqs = new HashMap<Integer,Integer>();
    
      for (int val : values) {
        Integer freq = freqs.get(val);
        freqs.put(val, (freq == null ? 1 : freq+1));
      }
    
      int mode = 0;
      int maxFreq = 0;
    
      for (Map.Entry<Integer,Integer> entry : freqs.entrySet()) {
        int freq = entry.getValue();
        if (freq > maxFreq) {
          maxFreq = freq;
          mode = entry.getKey();
        }
      }
    
      return mode;
    }
    

    【讨论】:

    • 如果计数超过 128,您可以使用 AtomicInteger 而不是 Integer 值来减少对象分配的数量。
    • 我喜欢这种确定模式的方法。解决方案实际上在 freqs.put(val, (freq == null ? 1 : freq+1));谢谢...
    【解决方案2】:

    这有点过时了,我不知道它的性能,但如果你愿意在你的 Java 中尝试一点 Groovy...

    static int modal( ArrayList values ) {
        use(Collections){
            values.max{ values.frequency(it) } 
        }
    }
    

    【讨论】:

    • 可以在 Java 中使用这些 Groovy 方法/类吗? (也就是说,只需要 Groovy 运行时库还是有其他魔法?)
    • 你只需要 groovy.jar。如果您的 ide 也支持 groovy,它会有所帮助(查看 Spring Tool Suite 和/或 Groovy eclipse 插件)。这是一个使用 netbeans 的示例:netbeans.org/kb/docs/java/groovy-quickstart.html#groovy
    【解决方案3】:

    一个基本的,虽然效率低下的算法是这样的:

    static int modal( int[] values ) {
        int modal = 0;
        int mfreq = 0;
        for( int i : values ) {
            // Is this value the most frequent we've found so far?
            int freq = 0;
            for( int j : values ) {
                if( j == i ) {
                    freq++;
                }
            }
            if( freq > mfreq ) {
                modal = i;
                mfreq = freq;
        }
        return modal;
    }
    

    您可以通过预先计算每个值的频率并将它们存储在地图或类似物中来做得更好,尽管这仍然需要遍历值,并且仍然需要另一个循环来确定哪个频率最高.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-05-06
      • 1970-01-01
      • 1970-01-01
      • 2017-03-16
      • 2014-05-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多