2009-04-04 10 views
4

Tout savoir comment puis-je obtenir la valeur de mode à partir d'un tableau? Par exemple, si j'ai un tableau avec un numéro de différence, comment puis-je utiliser Java pour rechercher quel numéro apparaît le plus?Obtenir la valeur de mode dans Java

Répondre

10

Se termine en O (n) par opposition à O (n^2). Nécessite des tableaux de longueur> 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

Vous pouvez utiliser des valeurs AtomicInteger au lieu de Integer pour réduire le nombre d'affectations d'objets si le nombre est supérieur à 128. –

+0

J'aime cette approche du mode de détermination. La solution est actuellement dans freqs.put (val, (freq == null? 1: freq + 1)); Merci ... –

0

Une base, mais l'algorithme inefficace serait quelque chose comme:

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

Vous pourriez faire un peu mieux par des fréquences pré-calcul pour chaque valeur et de les stocker, peut-être dans une carte ou similaire, bien que cela nécessitent toujours une boucle de valeurs, et nécessitent toujours une autre boucle pour déterminer qui a la fréquence la plus élevée.

3

Ceci est un peu là-bas, et je ne sais pas ses performances, mais si vous étiez prêt à essayer un peu Groovy avec votre Java ...

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

Ces méthodes/classes Groovy peuvent-elles être utilisées depuis Java? (C'est-à-dire, est-ce que tout ce qui est nécessaire est la bibliothèque d'exécution de Groovy ou y a-t-il d'autre magie?) –

+1

vous avez juste besoin de groovy.jar. Cela aide si votre ide supporte groovy aussi (consultez Spring Tool Suite et/ou le plugin Groovy eclipse). Voici un exemple utilisant netbeans: http://netbeans.org/kb/docs/java/groovy-quickstart.html#groovy –

Questions connexes