Les plus courantes Chaîne dans ArrayList()
Est-il un moyen de trouver le plus commun String
dans un ArrayList
?
ArrayList<String> list = new ArrayList<>();
list.add("test");
list.add("test");
list.add("hello");
list.add("test");
Doit trouver le mot "test" à partir de cette liste ["test","test","hello","test"]
- Oui il y a un moyen. Mais pas de direct. Vous avez à écrire un peu de code.
- Oui, vous devez utiliser la Carte par exemple table de hachage
InformationsquelleAutor EspenG | 2014-04-10
Vous devez vous connecter pour publier un commentaire.
Ne pas réinventer la roue et utiliser les
frequency
méthode de laCollections
classe:Si vous avez besoin de compter les occurrences de tous les éléments, l'utilisation d'une Carte et de la boucle intelligemment 🙂
Ou mettre votre liste dans un Ensemble et boucle sur chaque élément de l'ensemble avec les
frequency
méthode ci-dessus. HTHMODIFIER /Java 8: Si vous avez envie d'un plus fonctionnel, Java 8 one-liner solution avec les lambdas, essayez:
w->w
utilisationFunction.identity()
w -> w
moins de commentaires dans une langue où plus de concision n'aurait pas fait beaucoup de mal. Tout argument fort en faveur deFunction.identity()
?Dans les statistiques, c'est la "mode". À la vanille, Java 8 solution ressemble à ceci:
Ce qui donne:
jOOλ est une bibliothèque qui prend en charge
mode()
sur les cours d'eau. Le programme suivant:Rendements:
(disclaimer: je travaille pour la société derrière jOOλ)
Vous pouvez faire un
HashMap<String,Integer>
. Si la Chaîne est déjà présente dans la carte, incrémenter sa clé par un, sinon, l'ajouter à la carte.Par exemple:
Alors, supposons qu'elle est "someValue" encore une fois, vous pouvez le faire:
Depuis le clé de "someValue" est 1, maintenant, quand vous la mettez, la clé sera de 2.
Après cela, vous pouvez facilement passer à travers la carte et d'en extraire le clé qui a le plus haut valeur.
je n'ai pas écrit une solution complète, essayez de construire un, si vous avez des problèmes de poster dans une autre question. La meilleure pratique est d'apprendre par vous-même.
Je pense que la meilleure façon de le faire est à l'aide de cartes contenant des comtes.
Et itérer sur votre tableau de remplissage de cette carte:
Enfin, vous pouvez obtenir le plus d'éléments répétés itération sur la carte:
Et de montrer le plus commun de la chaîne:
Comme par question, Spécialement juste pour passer le mot, pas le nombre de fois (c'est à dire la valeur de la clé).
Vous pouvez utiliser un
HashMap<String,Integer>
. En parcourant le tableau, vous pouvez vérifier pour chaqueString
si elle n'est pas déjà une Clé de votreHashMap
, ajouter et mettre la valeur à 1, si c'est l'augmentation de sa valeur de 1.Alors vous avez un
HashMap
avec tous uniquesString
s et associé à un numéro indiquant leur montant dans la matrice.Si quelqu'un a besoin de trouver les plus populaires de d'habitude String[] tableau (à l'aide de Listes):
je sais que cela prend plus de temps à mettre en œuvre, mais vous pouvez utiliser des tas de structure de données en les stockant dans les noeuds, le comte et la chaîne de l'information
Vous pouvez utiliser la Goyave est Multiset:
public class StringChecker {
}
Avec cette méthode, si il n'y a plus d'un la plupart des éléments communs dans votre liste de tableaux, vous obtenez de retour ensemble d'entre eux en les ajoutant à une nouvelle liste de tableaux.
Il y a beaucoup de réponses, ce qui suggère HashMaps. Je n'ai vraiment pas comme eux, parce que vous avez à parcourir une fois de plus de toute façon. Plutôt, je voudrais trier la Liste
et ensuite une boucle à travers elle. Quelque chose de semblable à
devrait le faire.
O(N)
complexité. Votre algorithme utilise le tri, ce qui estO(N log N)
complexité, ce qui est certainement le pire.