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

  • 6
  • Недоступна
Поиск аналогов и совпадений — любимое занятие программистов. Давайте проделаем вот что: введем с клавиатуры в список 20 слов и подсчитаем, сколько одинаковых слов в этом списке. Результат представим в виде словаря Map<String, Integer>, где первый параметр – уникальная строка, а второй – число (сколько раз данная строка встречалась в списке).
Вы не можете решать эту задачу, т.к. не залогинены.
Комментарии (251)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий вы должны авторизоваться
Максим Максович12 уровень, Гомель
понедельник, 18:49
Я решил одним фором. делаем цикл на количество элементов в листе через result.putIfAbsent(list.get(i),0); заносим все уникальные значения в мап. Добавит только уник значения. внутри фора иф, проверяем, содержит ли коллекция текущий элементы листа, если содержит то result.put(list.get(i), result.get(list.get(i)) + 1);
Валерий Виноградов14 уровень, Курган
23 сентября, 09:51
Решил в 5 строк. 1.Форич листа 2.Условие (содержит ли карта такой ключ) 3.Целочисленная переменная инициализируется текущим количеством повторений строки 4.Ложу в карту новую пару с таким же ключем и увеличенным значением (Тут затупил, не перепутайте инкремент с декрементом) 5.Иначе ложу строку и единицу
Артем38 уровень, Москва
23 сентября, 15:52
если использовать merge() то все в одну строку.
list.forEach(el -> result.merge(el,1,(oldVal,newVal) -> oldVal + newVal));
Максим Максович12 уровень, Гомель
понедельник, 18:47
а как это работает?
Артем38 уровень, Москва
понедельник, 18:57
в гугле есть описание методов merge() если вкратце. то 1 аргумент это ключ в HashMap 2 аргумент это новое значение (оно будет добавлено если данного ключа нет в HashMap. это равноценно map.put(1й аргумент, 2й аргумент) 3 аргумент это правила работы со значением, если данный ключ уже есть (oldVal, newVal) -> oldVal + newVal) он берет старое значение через map.get(ключ) , плюсует к нему новое, и записывает обратно. хороший метод. появился в Java8
Максим Максович12 уровень, Гомель
понедельник, 19:27
Спасибо. Полезно!
Evgeny Sanych14 уровень, Кемерово
16 сентября, 12:44
я один дрочевом занимался?) Первым циклом Заполнил хэшмап строками и в повторения забил 1 (он получается создал только уникальные кеи) вторым фором пробежался по этому хэшмапу и внутри циклом для каждого значения хэшмапа проходился по эрэйлисту и считал повторения и после этого цикла записывал в этот хэшмап значение))
Максим Силевич10 уровень, Витебск
позавчера, 20:40
Ох, поверьте - не один. Возможно, Вам, немножко полегчает от того, что у меня 2 фора и один ваил)))!
Алмаз17 уровень, Казань
14 сентября, 12:47
Collections.frequency - 2 строки красивого кода, без кучи дичи
Nuby15 уровень, Москва
9 сентября, 16:10
1. Создал Set с уникальными значениями 2. (итератором по Set) counter = Collections.frequency(list, element); 3. result.put(element, counter); профит
Sergey13 уровень, Минск
23 сентября, 21:30
Зачем лишние действия с созданием Set'a, если можно просто написать result.put(element, Collections.frequency(list, element));
Nuby15 уровень, Москва
24 сентября, 06:44
Затем, что я ее решал сам, а не заглядывал в советы. Интересно, что лучше... надо подумать - решать все своим умом или подсматривать готовые ответы.
Sergey13 уровень, Минск
24 сентября, 17:05
Естественно лучше решать самому, чем копипастить готовое решение. Только непонятно причём тут это? Я поинтересовался, так как после своего решения смотрю комментарии и как решали другие люди. Решений может быть много и из них можно почерпнуть информацию. В решении с созданием Set'a я не понял его необходимости, поэтому и спросил. Может такое решение правильно или есть устоявшиеся практики решать так. Я вообще решал через 2 цикла и equals, что, как оказалось, совсем не оптимально.
Дмитрий17 уровень, Новосибирск
1 сентября, 06:41
Тактика с минимальными нервозатратами: 1) форИчем проходимся по листу 2) возвращаем Collections.frequency каждого элемента в переменную int 3) кладём текущий элемент и значение в переменной из второго пункта в мапу result 4) возвразаем result profit
1diaamond14 уровень, Киев
25 августа, 22:17
В комментах такие дичайшие варианты решений😂 а задача решается всего одним циклом foreach
Nicha18 уровень, Тольятти
23 августа, 16:19
Создал второй лист, скопировал в него первый. Создал цикл for each с первым листом, в нём же переменную которая будет считать повторы слов. Дальше открыл еще один for each, в нём уже сравнивал слово из первого листа со всеми словами из второго листа и если было совпадение +1 к счетчику одинаковых слов. Дальше нужно добавить в мапу слово которое крутилось в первом цикле и число которое в счетчике.
Lyahasik14 уровень, Москва
20 августа, 10:03
Сбило с толку условие на регистр букв. А так задачка решается одним циклом спокойно при помощи containsKey.
19 августа, 14:38
В тестах регистр (большая/маленькая буква) влияет на результат - условие вообще не понял. Для чего оно? решил просто, два цикла, перебор, подсчет, если в мапе нет этого ключа то добавляем, можно было бы оптимизировать, но и так прошло)