Одинаковые слова в списке

  • 6
  • Недоступна
Поиск аналогов и совпадений — любимое занятие программистов. Давайте проделаем вот что: введем с клавиатуры в список 20 слов и подсчитаем, сколько одинаковых слов в этом списке. Результат представим в виде словаря Map<String, Integer>, где первый параметр – уникальная строка, а второй – число (сколько раз данная строка встречалась в списке).
Вы не можете решать эту задачу, т.к. не залогинены.
Комментарии (213)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий вы должны авторизоваться
Garadzienski16 уровень, Kraków
суббота, 16:50
У меня вышло только 4 строчки. 1) Цикл foreach for (String s: list) { 2) создаём переменную int count = Collections.frequency(list.s) 3) добавляем строку s и переменную count в Map }
Дмитрий Пиминов12 уровень, Усть-Илимск
29 мая, 16:41
Если почитать статью https://javarush.ru/groups/posts/524-khvatit-pisatjh-ciklih-top-10-luchshikh-metodov-dlja-rabotih-s-kollekcijami-iz-java8 то все делается в три строчки
RomanSmoll10 уровень
вторник, 15:07
Вот спасибо добрый человек! лайк
Юлия Швабович19 уровень, Минск
24 мая, 22:30
Ребята, метод Collections.frequency() ваш лучший товарищ в этой задаче! Я строила бесконечные циклы for each, а все решается в три строки 🤦‍♀️
Кирилл СПб11 уровень, Санкт-Петербург
23 мая, 19:00
тут кто как исхитрялся... но, имхо, вот так самое оно: 1. создаем foreach для перебора всех стрингов передаваемого в метод ArrayList 2. внутри создаем инт счетчик равный нулю 3. создаем еще один foreach для перебора всех стрингов передаваемого в метод ArrayList. в этом фориче сравниваем стринги со стрингом из верхнего форича. при совпадении увеличиваем счетчик. 4. по окончании внутреннего форича запихиваем в Мапу значение текущего стринга из первого форича и счетчик. усё
Михаил Клименко11 уровень, Краснодар
вчера, 19:50
спасибо, не хватало вашего комментария, чтобы паззл сложился :) но в следующий раз, конечно же, буду использовать Collection.frequency()
Виталий11 уровень, Лида
22 мая, 08:25
Решил через итератор. Ребята, есть вопрос
while (listIterator.hasNext()) {
            String nextListElement = listIterator.next();
            int frequency = Collections.frequency(list, nextListElement);
            result.put(nextListElement, frequency);
            listIterator.remove();
        }
С remove задача решается неправильно. Не считает сколько раз слово встречается в списке, но если его убрать все получается корректно(тут уже понимаю, что значение key не повторяется и оно просто перезаписывается). По идее remove же должен удалять слово и списка?
Екатерина14 уровень, Санкт-Петербург
22 мая, 18:41
Так сам же и ответил на вопрос) значение key перезаписывается, т.е. ты посчитал количество повторений для "Яблоко" - 4, затем удалил его из листа (только одно Яблоко). Далее итератор получает следующее яблоко и число повторений для него уже 3 (мы же один удалили). И так до одного яблока - 1. А если не удалять элемент, то запись будет перезаписываться, но количество останется 4. Пройдись дебагом, должно проясниться.
Виталий11 уровень, Лида
27 мая, 15:32
Спасибо:)
jForce11 уровень, Санкт-Петербург
15 мая, 20:08
Можно сделать однострочник через StreamAPI
HashMap<String, Integer> result = new HashMap<String, Integer>();
Map<String, Integer> resultTMP = list.stream().sorted().distinct().collect(Collectors.toMap(s->s,s->Collections.frequency(list,s)));
Что делает этот код: list.stream() - преобразует list в stream .sorted() - сортирует, это требуется для предсказуемой работы следующего метода .distinct() - оставляет только уникальные элементы, использует метод .equals .collect( - преобразует stream в набор элементов Collectors.toMap( - указываем, что хотим создать Map, причём именно Map, а не HashMap, поэтому первая строчка оставлена для выполнения условий задачи. Размерности Map компилятор берет из левой части Map<String, Integer> s->s - указываем, что берем элемент stream и называем его s это s->, далее используем его в качестве String s->Collections.frequency(list,s) - указываем, что берем элемент stream и называем его s это s->, далее используем результат метода Collections.frequency(list,s) для заполнения Integer Collections.frequency(list,s) - статический метод возвращает кол-во повторений s в коллекции list
Кирилл12 уровень
вчера, 09:38
.sorted().distinct() зачем в этой задаче ?
Вадим15 уровень, Саранск
13 мая, 18:58
Либо по старинке пузырьком, либо прогрессивно, используя метод frequency() класса Collections. Вам выбирать 😁
Темирлан Батчаев 12 уровень, Черкесск
13 мая, 15:09
Всё до необычайного просто. Объявляем переменную count; Проходимся циклом по списку Внутри цикла методом Collections.frequency проверяем сколько раз наше слово встречается в списке, это же значение присваиваем count Ну а дальше заполняем map, ключом ставим элемент нашего списка, а значением переменную count.
Alexander Chevtaev18 уровень, Bogorodsk
13 мая, 13:54
1. Загнал массив в сет (избавился от дублей) 2. foreach (для обхода сета) + 1 вложенный for (сравнение элементов сета с элементами массива для подсчета повторов) записывающий результат в Map
Roman Kiselev14 уровень, Пермь
12 мая, 04:06
два for при этом один из них вложенный.