J'ai un ArrayList
de mots avec des entrées en double.
Je veux compter et enregistrer les occurrences de chaque mot dans une structure de données.
Comment puis-je le faire?
Si vous n'avez pas une énorme liste de chaînes, le moyen le plus court de l'implémenter est d'utiliser Collections.frequency
méthode, comme ceci:
List<String> list = new ArrayList<String>();
list.add("aaa");
list.add("bbb");
list.add("aaa");
Set<String> unique = new HashSet<String>(list);
for (String key : unique) {
System.out.println(key + ": " + Collections.frequency(list, key));
}
Production:
aaa: 2
bbb: 1
Il y a beaucoup de possibilités. Une solution rapide à implémenter pourrait consister à utiliser un Map<String, Integer>
où la chaîne est chaque mot individuel et le nombre entier de chacun.
Parcourez la liste et augmentez la valeur correspondante dans la carte. S'il n'y a pas encore d'entrée, ajoutez-en une avec la valeur 1.
wordList = ....;
Map<String, Integer> wordCount = new HashMap<String, Integer>();
for(String Word: wordList) {
Integer count = wordCount.get(Word);
wordCount.put(Word, (count==null) ? 1 : count+1);
}
Voici une classe pilotée par les tests qui fera ce que vous voulez. D'abord le test:
import junit.framework.TestCase;
public class CounterTest extends TestCase {
private Counter<String> counter;
@Override
protected void setUp() throws Exception {
super.setUp();
counter = new Counter<String>();
}
public void testInitialCountIsZero() throws Exception {
assertEquals(0, counter.get("a"));
}
public void testCount() throws Exception {
counter.count("a");
assertEquals(1, counter.get("a"));
}
}
Maintenant la classe:
import Java.util.HashMap;
public class Counter<T> {
private final HashMap<T, Integer> map = new HashMap<T, Integer>();
public int get(T key) {
final Integer n = map.get(key);
return n == null ? 0 : n;
}
public void count(T key) {
map.put(key, get(key) + 1);
}
}
Pour résoudre votre problème spécifique, vous créez un compteur et parcourez votre liste en comptant chaque élément.
Counter<String> counter = new Counter<String>();
for (String string: myList)
counter.count(string);
Ou si vous êtes trop paresseux pour le faire vous-même (ou un bon programmeur industriel: p), utilisez Multiset de google guava.