2009-04-04 2 views
4

どのように私は配列からモード値を取得できますか?例えば、私が数の異なる配列を持っている場合、Javaを使ってどの数字が最も出現しているかを調べるにはどうすればよいですか?Javaのモード値を取得

答えて

10

O(n^2)ではなくO(n)で完了します。 > 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; 
} 
+2

整数値の代わりにAtomicIntegerを使用して、数が128を超える場合にオブジェクト割り当ての数を減らすことができます。 –

+0

この方法を決定する方法が似ています。解は実際にはfreqs.put(val、(freq == null?1:freq + 1))にあります。ありがとう... –

0

非効率的なアルゴリズムとはいえ、基本的には何かのようになります:あなたがすることによって少し良く行うことができ

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; 
} 

事前計算値ごとに周波数を、おそらくマップまたは同様に、それらを格納し、これはあろうが依然として値をループすることを必要とし、どの周波数が最も高いかを決定するために別のループを必要とする。

3

これはそこに少しあり、そしてそれはパフォーマンスだについて、私は知らないが、あなたはJavaを使用し、ほとんどのGroovyを試して喜んでいたならば...長さの配列が必要です

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

これらのGroovyメソッド/クラスはJava内から使用できますか? (つまり、必要なのはGroovyのランタイムライブラリだけですか他の魔法がありますか?) –

+1

groovy.jarが必要です。もしあなたのideがGroovyをサポートしているなら、Spring Tool SuiteやGroovy Eclipseプラグインをチェックしてください。 netbeansを使用した例は次のとおりです。http://netbeans.org/kb/docs/java/groovy-quickstart.html#groovy –

関連する問題