JavaRush
Акция
Университет
Java FullStack
Python FullStack
new
Web FullStack
new
Обучение
Курсы
Задачи
Опросы
Игры
Помощь
График пинков
Стажировка
Сообщество
Пользователи
Форум
Чат
Статьи
Истории успеха
Активности
Отзывы
Подписки
Светлая тема
Вопрос
  • Отзывы
  • О нас
  • CS50
Начать
Начать обучение
Начать обучение
  • Все вопросы
JavaRush/Помощь по Java задачам/подскажите что не так, плиз
Roman
16 уровень
  • 26.02.2019
  • 994просмотров
  • 9комментариев

подскажите что не так, плиз

Вопрос по задаче Одинаковые слова в списке
Java Syntax,  10 уровень,  11 лекция
Решен


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

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

Требования:
  • Метод countWords должен объявлять и инициализировать HashMap с типом элементов <String, Integer>.
  • Метод countWords должен возвращать созданный словарь.
  • Метод countWords должен добавлять в словарь ключи, соответствующие уникальным словам, и значения по этим ключам, отображающие, сколько раз встречалось слово.
  • Программа должна выводить на экран полученный словарь.
  • Метод main должен вызывать метод countWords.
package com.javarush.task.task10.task1016; import java.io.BufferedReader; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.Map; /* Одинаковые слова в списке */ 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()); } } 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++){ int count =0; if (result.containsKey(list.get(i))){ count++; result.put(list.get(i),count); }else { result.put(list.get(i),count); } } return result; } }
0
Комментарии (9)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Denys
Уровень 34
26 февраля 2019, 15:51решение
На такой тест:
for (int i = 0; i < 20; i++) {
    if (i % 2 == 0) {
        words.add("hi");
    } else {
        words.add("hi" + i);
    }
}
Ваша программа вывела мне: hi 1 hi1 0 hi11 0 hi3 0 hi13 0 hi5 0 hi15 0 hi7 0 hi17 0 hi9 0 hi19 0 Если всё же сложно понять в чём проблема, то ищите её вот тут:
for (int i=0;i<list.size();i++){
    int count =0; // вот тут
    if (result.containsKey(list.get(i))) {
        count++; // и тут
        result.put(list.get(i),count); // и тут
    } else {
        result.put(list.get(i),count); // и тут
    }
}
А проблема сама вот в чём то. Вы проверяете если мапа содержит текущий элемент из списка, то увеличиваете счётчик на 1. И всё, больше 1 ваш счётчик никогда не станет, то есть если в список завести слово hi 20 раз, то ваша программа выведет: hi 1. Попробуйте просто:
if (result.containsKey(list.get(i))) {
    int count = result.get(list.get(i));
    result.put(list.get(i), ++count);
} else {
    result.put(list.get(i), 1);
}
Всё просто, если такого элемента в мапе нету, то добавляем его со счётчиком 1. Если такой элемент присутствует, получаем его значение value и увеличиваем его на единицу.
+5
Roman
Уровень 16
27 февраля 2019, 11:25
спасибо за развернутое объяснение)
0
Denys
Уровень 34
27 февраля 2019, 15:30
Пожалуйста. Успехов в обучении!)
0
Nikolay Boguslavsky
Уровень 25
11 марта 2019, 11:54
if (result.containsKey(list.get(i))) {
    int count = result.get(list.get(i));
    result.put(list.get(i), ++count);
}
я не могу понять как работает данный код, объясните, пожалуйста!
0
Denys
Уровень 34
12 марта 2019, 20:21
Ну смотрите, тут всё предельно просто. Вы проверяете если ваша мапа содержит текущий элемент из списка, то: 1. получаем её значение по ключу, т.е. текущее количество повторений слова 2. добавляем в мапу это же значение, только со значением на одно больше Как нам известно, мапа уникальна своим ключом. Поэтому нам приходиться каждый раз получать текущее значение по ключу, и увеличивать его на единицу. Таком образом мы сохраняем наш ключ, а значение с каждым повторением инкрементируем на единицу)
+1
Nikolay Boguslavsky
Уровень 25
13 марта 2019, 07:23
Спасибо! Я уже ранее сам разобрался) Просто метод .get у списка и .get у мапы проделывают разную работу -- это меня и сбивало с толку.
0
Denys
Уровень 34
26 февраля 2019, 15:39
А вы пробовали проверять на работоспособность вашу программу?
0
Roman
Уровень 16
26 февраля 2019, 14:50
если ставить "int count = 1;" то тоже не работает
0
Don Fear
Уровень 41
27 февраля 2019, 07:09
Подсказка №2: искать там, где указал DeH4uK, проблему в логике программы.
0
Обучение
  • Курсы программирования
  • Регистрация
  • Курс Java
  • Помощь по задачам
  • Цены
Сообщество
  • Пользователи
  • Статьи
  • Форум
  • Чат
  • Истории успеха
  • Активности
Компания
  • О нас
  • Контакты
  • Отзывы
  • FAQ
  • Поддержка
JavaRushJavaRush — это интерактивный онлайн-курс по изучению Java-программирования c нуля. Он содержит 1200 практических задач с проверкой решения в один клик, необходимый минимум теории по основам Java и мотивирующие фишки, которые помогут пройти курс до конца: игры, опросы, интересные проекты и статьи об эффективном обучении и карьере Java‑девелопера.
Подписывайтесь
Язык интерфейса
Русский
English Українська
"Программистами не рождаются" © 2026 JavaRush
MastercardVisa
"Программистами не рождаются" © 2026 JavaRush