Как посчитать дубликаты в массиве строк? - PullRequest
2 голосов
/ 29 августа 2011

Как разделить строку, чтобы извлечь все слова / термины, встречающиеся в ней, и посчитать, сколько раз каждое из них встречается?Например, пусть: String q = "foo bar foo" Я хочу DS {<foo,2>, <bar,1>}.Это наименее подробный код, который я использую *.Неисправности или менее подробные альтернативы?

String[] split = q.toString().split("\\s");
        Map<String, Integer> terms = new HashMap<String, Integer>();

        for (String term : split) {
            if(terms.containsKey(term)){
                terms.put(term, terms.get(term)+1);
            }
        }

(не скомпилировали)

Ответы [ 2 ]

5 голосов
/ 29 августа 2011

Модифицированный код:

String[] split = q.toString().split("\\s");
Map<String, Integer> terms = new HashMap<String, Integer>();

for (String term : split) {
    int score = 0;
    if(terms.containsKey(term)){
        score = terms.get(term);
    }

    terms.put(term, score +1);
}

PS: Не проверено.

0 голосов
/ 29 августа 2011

Я бы пошел с кодом, предложенным Elite Gentleman, но я просто ставлю это в качестве темы для обсуждения: как насчет использования StringTokenizer?Если бы масштабируемость / производительность была проблемой, токенизатор работал бы лучше?В этом случае вам может понадобиться выполнить цикл по строке только один раз, вместо того, чтобы сначала выполнить разбиение регулярного выражения, а затем еще один проход по массиву.

Примерно так:

StringTokenizer st = new StringTokenizer(s);
HashMap<String, Integer> terms = new HashMap<String, Integer>();

while (st.hasMoreElements()) {

    String term = st.nextToken();
    int score = 0;
    if(terms.containsKey(term)){
        score = terms.get(term);
    }

    terms.put(term, score +1);
}

Я знаю, что StringTokenizer, хотя и не считается устаревшим, является классом Legacy в соответствии с документами Java, и его использование не рекомендуется:

StringTokenizer - это устаревший класс, который сохраняется из соображений совместимости, хотя его использование не рекомендуется в новом коде.Всем, кто ищет эту функциональность, рекомендуется вместо этого использовать метод split String или пакет java.util.regex.

Однако мне интересно, если в этом случае для простого токена он дает более производительные результаты.

Есть мысли?

...