web-dev-qa-db-fra.com

Compter les occurrences de mots dans ArrayList

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?

17
Francesco Nigro

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
55
lukastymo

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);
}
12
Kosi2801

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);
1
Carl Manaster

Ou si vous êtes trop paresseux pour le faire vous-même (ou un bon programmeur industriel: p), utilisez Multiset de google guava.

0
Enno Shioji