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

  • 10
  • Недоступна
Сложно представить себе ситуацию, в которой может понадобиться программа, которую мы предлагаем вам написать. Впрочем, маленькая модификация, и она обретает практический смысл. Также её можно представить частью чего-то большего (поиска?). Давайте создим словарь, занесём в него записи по принципу «фамилия» - «имя» и удалим людей с одинаковыми именами.
Вы не можете решать эту задачу, т.к. не залогинены.
Комментарии (366)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий вы должны авторизоваться
Max9 уровень
понедельник, 11:38
Решил через цикл в цикле. Создал ArrayList с именами. Затем циклом i брал имя из листа names и сверял его со всеми именами в коллекции map, если совпадало запускал метод на удаление. Внутренний цикл j нужно начинать с j=i+1, что б не проверять значение само на себя. После удаления значения, можно было бы еще каждый раз обновлять список имен names, в таком случае будет уменьшаться names.size() и соответственно количество переборов. Может у кого какие то замечания? List<String> names = new ArrayList<String>(map.values()); for(int i = 0; i<names.size(); i++) for(int j = i+1; j < names.size(); j++) if(names.get(i).equals(names.get(j))) removeItemFromMapByValue(map, names.get(i));
Святослав Кобывников8 уровень, Киев
понедельник, 10:49
Очень не рационально! Намного проще сделать дважды флип. Т.е. пройтись по мапе и скопировать в новую, только поменять местами ключ-значение, а потом по полученной пройтись еще раз и получить та которая была но без повторяющихся значений.
Koipse10 уровень
воскресенье, 01:32
Когда все работает, но валидатор говорит, что нифига подобного, приходится такие косыли писать, что сам диву даешься, ептить... З.Ы: Не тратьте нервы, как я, написав кучу костылей через листы, сэты-ху*ты. Хоть у вас все будет идеально, но хоть ты тресни – валидатор будет орать, что ему что-то не нравится. Используйте ArrayList с аргументом map.values() ,а затем Collections.frequency в if(), где нужно сравнить элементы и если совпадение больше единицы, то вызвать метод и все.
Алексей10 уровень, Москва
суббота, 14:37
Сделал так: Шаг1. Создал ArrayList и сохранил в него все имена (10шт, for-each). Шаг2. Запустил одновременно по ArrayList 2 цикла в разные стороны (с i = 0 до i < list.size()) (j = list.size() до j > i) Шаг3. Проверил равны ли list.get(i) и list.get(j) и если да, то вызывал метод removeItemFromMapByValue
Alexey Prilessky9 уровень, Минск
9 октября, 18:11
Сначала писали, что в for each нельзя изменять коллекцию, т.е вносить изменения или что то удалять, а в этой задаче уже написанный авторами метод удаляет из map элемент. Как это вообще понимать ?
Анастасия10 уровень, Новосибирск
суббота, 05:24
Он из копии удаляет. Бежит по одному экземпляру, а удаляет из другого.
Gulnara Shaikhutdinova12 уровень, Ульяновск
вчера, 12:40
итерируемся по копии, удаляем из оригинала.
Eugene Semenov10 уровень, Санкт-Петербург
8 октября, 20:03
классная задача. так же делал через ArrayList.
Егор Гераськин14 уровень, Саратов
8 октября, 11:17
Смысл решения в том, чтобы в какую-то структуру(массив, ArrayList, Set, Map, ...) собрать имена, которые встречаются более 1 раза. А затем пройти по этой структуре и вызвать для каждого имени уже написанный метод для удаления из map-a всех пар с этим именем. Написал сначала самое простое решение с обычным Array: перебираем все пары, и добавляем все имена в Array. То есть в Array - все 10 имен. Сортируем этот массив методом Arrays.sort(). Теперь все одинаковые имена рядом в массиве, и достаточно по нему пройтись и сравнить соседние строки методом equals, вызывая при совпадении написанный метод removeItemFromMapByValue. Но это решение почему-то не проходило. Поэтому написал следующее решение: создаём дополнительные Set и ArrayList. Идём по всем парам, проверяем есть ли имя в Set - и если да то добавляем его в ArrayList, далее в любом случае добавляем имя в Set. Теперь когда в ArrayList все имена дубли - дальше знаем что делать. В этом способе ArrayList можно заменить на ещё один Set, чтобы не было дублей, но проходит и так.
Valentine9 уровень, Днепр
понедельник, 14:33
у меня прошло с сортировкой, только через Collections.sort(arrayList);
Михаил Паскевич12 уровень, Киев
7 октября, 17:27
Делал через ArrayList<String> names = new ArrayList<>(map.values()); и Set дублирующихся имен... решить только через Map не смог....
maratod9 уровень
7 октября, 12:48
Сделал сложно вот так 1. Создал копию map - copy. 2. Запустил Цикл for Each(map) в Цикле for Each(copy). В первом получал последовательно все Имена прогонял, во втором сверял на наличии дубликатов. И если были то записывал Имя в новый ArrayList. 3. Пробежался по ArrayList и удалил из map все имена что были в ArrayList.
Artem Safronov9 уровень
23 сентября, 12:05
Задача сложная. Как и всегда, пришлось гуглить, читать и тд. Collections.frequency(); решил не использовать, просто чтобы больше подумать. Итого: 1.Делаем список, в который кладем значения нашей мапы, т.е. map.values(). 2. Через for each проходим по нашему списку 3. Внутри for each создаем переменную, например, count. После нее создаем цикл for, в котором уже сравниваем через .equals наши значения, т.е. значение из for each со значением в этом цикле for. 4. Если значения совпадают - то count++. 5. Если count > 1, то удаляем из мапы это значение, используя метод removeItemFromMapByValue(Map<String, String> map, String value)
Дмитрий Чесноков9 уровень, Санкт-Петербург
29 сентября, 14:29
долго думал как решить и решил по Вашему методу, спасибо!