Считать количество слов в ArrayList

У меня есть ArrayList слов с повторяющимися записями.

Я хочу подсчитывать и сохранять вхождения для каждого слова в структуре данных.

Как я могу это сделать?

Ответы

Ответ 1

Если у вас нет огромного списка строк, кратчайший способ реализовать его - использовать метод Collections.frequency, например так:

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

Выход:

aaa: 2
bbb: 1

Ответ 2

Есть много возможностей. Быстрое решение для реализации может заключаться в использовании Map<String, Integer>, где String - это каждое отдельное слово, а Integer - счет каждого из них.

Пройдите по списку и увеличьте соответствующее значение на карте. Если запись еще не введена, добавьте ее со значением 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);
}

Ответ 3

Здесь тестовый класс, который будет делать то, что вы хотите. Сначала тест:

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

Теперь класс:

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

Чтобы решить вашу конкретную проблему, вы должны создать счетчик и выполнить итерацию по списку, подсчитывая каждый элемент.

Counter<String> counter = new Counter<String>();
for (String string: myList)
    counter.count(string);

Ответ 4

Или, если вы слишком ленитесь, чтобы сделать это самостоятельно (или хороший промышленный программист: p), используйте Multiset из google guava.