task.task10.task1016 - не проходит проверку. Прошу объяснить, что не так, и объяснить, как правильно.

Задание:

Ввести с клавиатуры в список 20 слов.

Нужно подсчитать количество одинаковых слов в списке.

Результат нужно представить в виде словаря Map<String, Integer>, где первый параметр – уникальная строка, а второй – число, сколько раз данная строка встречалась в списке.

Вывести содержимое словаря на экран.

В тестах регистр (большая/маленькая буква) влияет на результат.

Решение:

public class Solution {
    public static void main(String[] args) throws Exception {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

        ArrayList<String> words = new ArrayList<String>();
        for (int i = 0; i < 20; i++) {
            words.add(reader.readLine());
        }

        Map<String, Integer> map = countWords(words);

        for (Map.Entry<String, Integer> pair : map.entrySet()) {
            System.out.println(pair.getKey() + " " + pair.getValue());
        }
    }

    <u>public static Map<String, Integer> countWords(ArrayList<String> list) {
        HashMap<String, Integer> result = new HashMap<String, Integer>();
        //напишите тут ваш код
        for (int i = 0; i < list.size(); i++) {
            Integer count = 0;
            for (int j = 0; j < list.size(); j++) {
                if (list.get(j).equals(list.get(i))) {
                    count = count + 1;
                }
            }
            if (!result.containsKey(list.get(i))) {
                result.put(list.get(i), count);
            }
        }
        return result;
    }</u>

}

4 комментария

sibiriak
Мудреный код. Попробуй считать слово и сразу его проверить на совпадения в словаре.
EleNikIvi
Насколько помню в этой задаче валидатор пропускает только упрощенные варианты где макс. один цикл. Воспользуйтесь методом frequency() для подсчета совпадений
zzzz
for (int i = 0; i < list.size(); i++) {
            Integer count = 0;
            for (int j = 0; j < list.size(); j++) {
                if (list.get(j).equals(list.get(i))) {
                    count = count + 1;
                }
            }
            if (!result.containsKey(list.get(i))) {
                result.put(list.get(i), count);
            }
        }


Вот тут вы считаете одно и тоже слово несколько раз.
Допустим у вас в листе слова (слово, слово, слово, слово) — ваш метод отработает так:
1. берем первое слово (цикл с i) и сравниваем со всеми (цикл j), даже с самим собой — на выходе count == 4
2. берем второе слово (цикл с i) и сравниваем со всеми (цикл j), даже с самим собой — на выходе count == 8
3. и т.д. на выходе по завершении всех циклов count == 16, а должен быть 4.

второй цикл (j) вам совсем не нужен — бегайте по циклу (i):
1. берете первое слово и смотрите в Map такое слово есть или нет
2. если нету, добавляете слово в словарь со значением 1
3. если есть:
3.1 берете значение для слова из словаря
3.2 увеличиваете на еденицу
3.3 кладете слово в словарь с новым значением (т.к. такое слово уже есть в словаре, то старое значение перепишется новым.
Jenia0106
Да, я так и сделал уже :) Тут все правы, с кодом я намудрил, можно было сделать намного проще. Но с переменной count проблем бы не было, ибо я обнуляю ее каждый раз, когда перехожу к новому слову в цикле с i.
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.