Нам повторы не нужны

  • 10
  • Недоступна
Сложно представить себе ситуацию, в которой может понадобиться программа, которую мы предлагаем вам написать. Впрочем, маленькая модификация, и она обретает практический смысл. Также её можно представить частью чего-то большего (поиска?). Давайте создим словарь, занесём в него записи по принципу «фамилия» - «имя» и удалим людей с одинаковыми именами.
Вы не можете решать эту задачу, т.к. не залогинены.
Комментарии (812)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Евгений N
Уровень 10
14 апреля, 07:54
а нужно удалить и оригинал (если у него есть дубликаты) и дубликаты? или только дубликаты? т.е. если у меня два Dunkan, то должен остаться один или ноль?
Евгений N
Уровень 10
14 апреля, 09:59
судя по решению нужно удалять и оригинал (если у него есть копии) и копии. стандартное решение: пробегаем map 1000 раз (NxN в "нашем" методе и xN в методе удаления). имхо, можно и поменьше бегать (да и без копирования обошелся), итого, в "нашем" методе: - вместо копии map заводим пустой Set - заводим while (по факту будет работать столько раз, сколько удалений) - в while цикл2: бегаем по map: если элемента нет в set - добавляем, если есть: выходим из цикла2 (т.е. при первом же дубле, а не бегаем и считаем их всех), вызываем удаление (1 раз для значения, а в "решении" - столько раз сколько дублируется!), очищаем set, продолжаем цикл while. если цикл 2 полностью пройден (без досрочного выхода) - выходим и из цикла while.
Dmitry Vasilyev
Уровень 9, Самара, Россия
12 апреля, 18:58
Сделал копию Map в методе (removeTheFirstNameDuplicates), пробежался по всем элементам копии. Каждый элемент копии удалял из основного map по ключу и значению. После этого проверял наличие имени данного элемента в основном map (contains()), если оставались ещё, применял метод удаления всех значений, если нет - возвращал обратно.
Firs02
Уровень 10, Москва
23 февраля, 21:21
Решал задачи все быстро, наткнулся на эту и встал по полной программе. Не выдержал и посмотрел решение. Для меня было открытие что через FOReach можно было просто вызывать map.values и класть все это в String. Это действительно упрощает решение задач связанные с мапами.
Anonymous #733630
Уровень 8, Vsevolozhsk, Россия
16 февраля, 16:54
Объясните, пожалуйста, зачем всегда создавать копию словаря Map<String, String> для операций внутри циклов?
Tesla EXV
Уровень 12, Москва, Россия
12 апреля, 08:51
Потому что невозможно, используя расширенный for, перебирать элементы словаря и одновременно их модифицировать(например, удалять). Поэтому перебор происходит по копии, а, например, удаление элементов - уже из оригинального словаря. Если не хочется плодить копии словарей, то можно использовать Iterator. Данная тема была хорошо раскрыта в одной из предыдущих задач "Больше 10? Вы нам не подходите 8 уровень 8 лекция". Советую решить ее и почитать комментарии под задачей.
SanGali
Уровень 15, Самара, Россия
12 февраля, 22:41
Вывел values в ArrayList, прогнал через вложенный цикл, удаляя дубликаты вызовом предложенной функции. Приятная задачка) Пришлось почитать. Много))
Денис
Уровень 14, Пермь, Россия
8 февраля, 14:59
Решил с помощью ArrayList, добавил в него имена и проверял их по очереди, решил конечно не без помощи, пришлось задавать вопросы.
Andrew
Уровень 16, Москва, Россия
24 января, 08:27
в готовом решении в каждом из методов создается копия мапы, не слишком ли это затратно по ресурсам?
Iv@n
Уровень 12, Минск, Беларусь
18 января, 14:04
Я понял только одно - foreach рулит!!! Ну и Iterator тоже не плох😉
Admin QA Engineer
3 января, 08:13
Что-то я потерялся. Что вообще тут происходит?)) Пойду с начала 7 лекции все повторять.
Elidriel
Уровень 35, Воронеж
17 декабря 2021, 09:16
Закостылено! Суть в том, что в методе removeTheFirstNameDuplicates нужно отобрать повторяющиеся имена. Ничего умнее следующего алгоритма в голову не пришло: 1) создать два ArrayList list1 и list2; 2) пройтись foreach по передаваемой в метод мапе (а конкретно по ее значениям) с условием, что если в list1 нет совпадений с текущим значением, то записываем данное значение в list1, а если ееесть - то в list2; 3) остается пройтись foreach по list2, вызывая в каждом проходе removeItemFromMapByValue. PS: но предлагаемое правильное решение поэлегантней конечно)