2009-09-26 15 views
2

comment vous revenez nombre de valeurs distinctes/uniques dans un tableau par exempleJava (comptage Entiers Distinct)

int[] a = {1,2,2,4,5,5}; 
+2

Est-ce toujours trié? Cela compte, en supposant que vous cherchez la méthode la plus efficace. –

+0

non, il ne sera pas toujours trié. parfois je vais devoir trier d'abord –

+0

Il serait probablement utile si vous pouviez donner plus de détails dans votre question. Par exemple, cherchez-vous une solution efficace? Toute solution? Une solution utilisant votre propre algorithme? Une solution utilisant une structure de données que Java a (par exemple, la réponse de dcrosta)? –

Répondre

4

Un ensemble stocke chaque élément unique, (tel que défini par equals()) en une seule fois , et vous pouvez l'utiliser pour simplifier le problème. Créer un ensemble (j'utiliserais un HashSet), itérer votre tableau, ajouter chaque entier à l'ensemble, puis retourner .size() de l'ensemble.

+2

Assez sûr qu'un ensemble aura une méthode .size() ou .length() ou .count() pour obtenir le nombre d'éléments qui s'y trouvent. –

+0

bien sûr, l'OP a demandé le nombre d'entiers distincts, pas une liste d'entiers distincts. La même approche s'applique, cependant. –

+0

Guh. Je l'ai écrit de cette façon à l'origine, que de réinterpréter la question. Édité maintenant. – dcrosta

13
Set<Integer> s = new HashSet<Integer>(); 
for (int i : a) s.add(i); 
int distinctCount = s.size(); 
3

Une méthode efficace: Triez le tableau avec Arrays.sort. Ecrire une boucle simple pour compter les valeurs égales adjacentes.

+0

+1. C'est la meilleure réponse puisque Latoya ne demande que le nombre de valeurs distinctes. –

+0

Je pense que le crosta est généralement meilleur car il est plus facile et moins susceptible de mal tourner. Ma réponse est seulement si l'exécution de cette tâche particulière importe (comme toujours, de préférence mesure la solution simple pour voir si elle est confortablement suffisante d'abord). –

2

Dépend vraiment du nombre d'éléments dans le tableau. Si vous ne traitez pas une grande quantité d'entiers, un HashSet ou un arbre binaire serait probablement la meilleure approche. D'un autre côté, si vous avez un grand nombre d'entiers différents (disons plus d'un milliard), il peut être judicieux d'allouer un tableau d'octets 2^32/2^8 = 512 MByte dans lequel chaque bit représente l'existence ou non -existence d'un nombre entier, puis compte le nombre de bits définis à la fin. Une approche d'arbre binaire prendrait n * log n time, tandis qu'une approche de tableau prendrait n fois. De plus, un arbre binaire nécessite deux pointeurs par nœud, donc votre utilisation de la mémoire serait également beaucoup plus élevée. Une considération similaire s'applique également aux tables de hachage.

Bien sûr, si votre jeu est petit, utilisez simplement le HashSet intégré.