Сколько раз встречается каждое слово в тексте

963
29 декабря 2016, 07:05

Задача :

В единственной строке записан текст. Для каждого слова из данного текста подсчитайте, сколько раз оно встречалось в этом тексте ранее.
Словом считается последовательность непробельных символов идущих подряд, слова разделены одним или большим числом пробелов или символами конца строки.

Мой ход решения :

Считываем строку с клавиатуры, определяем сколько слов в строке, создаем массив типа String. Длина массива равна количеству слов в строке. В индексы массива сохраняем каждое слово. После сравниваем между собой все элементы и ведем счётчик.

Мой код :

import java.util.Scanner;
public class Semnadcat1 {
    public static void main(String[] args) {
        System.out.println("Введите текст");
        Scanner in = new Scanner(System.in);
        String s = in.nextLine();
        int a = s.split(" ").length;
        int i;
        String[] b = new String[a];
        for (i = 0; i < a; i++) {
            for (String retval : s.split(" ")) {
                b[i] = retval;
                System.out.println(b[i]);
            }
        }
    }
}

Ошибки:

Не удается поместить слова в элементы массива.

Answer 1

Метод split возвращает массив String (слов в данном случае), поэтому нет необходимости вручную добавлять слова в массив.
Для упрощения подсчета количества вхождений каждого слова можно хранить пары "слово - количество" в HashMap.

public static void main(String[] args)
{
    System.out.println("Введите текст");
    Scanner in = new Scanner(System.in);
    String string = in.nextLine();
    String[] words = string.split("\\s+");
    HashMap<String, Integer> wordToCount = new HashMap<>();
    for (String word : words)
    {
        if (!wordToCount.containsKey(word))
        {
            wordToCount.put(word, 0);
        }
        wordToCount.put(word, wordToCount.get(word) + 1);
    }
    for (String word : wordToCount.keySet())
    {
        System.out.println(word + " " + wordToCount.get(word));
    }
}

Также split сделан по "одному или нескольким пробельным символам" с помощью регулярного выражения, что помогает избежать проблем с пустыми словами из-за идущих подряд пробелов.

Answer 2

Вариант со стримами:

String text = "text hello   text";
String word = "text";
long count = Arrays
            .stream(text.split("\\s+"))
            .filter(word::equals)
            .count();
READ ALSO
В первый раз долго загружается Activity

В первый раз долго загружается Activity

На MainActivity есть кнопка при нажатии на которую происходит переход на другое Activity

436
Чем удобны методы геттеры/сеттеры? [дубликат]

Чем удобны методы геттеры/сеттеры? [дубликат]

На данный вопрос уже ответили:

516
Как в адаптере выделить цветом только определенный айтем

Как в адаптере выделить цветом только определенный айтем

Я использую для Spinner собственный адаптер, который должен изменять цвет первого пункта и в открытом состоянии, и в закрытомПроблема заключается...

422