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

  • 5
  • Недоступна
Сложно представить себе ситуацию, в которой может понадобиться программа, которую мы предлагаем вам написать. Впрочем, маленькая модификация, и она обретает практический смысл. Также её можно представить частью чего-то большего (поиска?). Давайте создим словарь, занесём в него записи по принципу «фамилия» - «имя» и удалим людей с одинаковыми именами.
Вы не можете решать эту задачу, т.к. не залогинены.
Комментарии (234)
  • популярные
  • новые
  • старые
Для того, что бы оставить комментарий вы должны авторизоваться
Arjuna8 уровень
пятница, 22:07
Решил где то за два часа, загвоздка была в том, что сперва преобразовал map.values() в обычный массив и там что то не срабатывало. А вот с ArrayList проблем не оказалось Способ такой: 1) Создаем ArrayList и записываем туда все имена; 2) Проходим по этому списку имен в двух циклах, один вложен во второй - в первом цикле присваиваем первое имя ( i = 0 ) стринговой переменной s - во втором сравниваем это имя поочередно со всеми оставшимися именами, то есть начиная с i+1 3) увеливаем i на 1 и повторяем весь процесс 4) если s.equals(values.get(j)) то вызываем метод removeItemFromMapByValue(Коллекция, имя), который удаляет это совпавшее имя с Коллекции
Евгений10 уровень, Днепр
пятница, 21:53
Я решал так. Ну, почти, с точностью до синтаксиса, но смысл такой же. :)
with cte as (
select count(0) over(partition by firstName) as cnt, *
from table)
delete from cte
where cnt > 1
Владимир Павленко18 уровень, Москва
среда, 22:14
Блин! 12 попыток из-за невнимательности. Все решил в методе майн и забыл перенести решение в метод removeTheFirstNameDuplicates. Все не мог понять почему не засчитывают решение :) Мне помогло эта статья http://qaru.site/questions/9531381/which-approach-is-better-for-finding-the-frequency-of-element-in-...
Yan Nezamutdinov8 уровень
среда, 16:43
По порядку:
HashSet<String> set = new HashSet<>();
Создаем Set (мы же крутые программисты). Туда будем записывать повторяющиеся имена. Set гарантирует что имена у нас внутри списка дублироваться не будут. Что то мне кажется что если removeItemFromMapByValue передать в value имя, а его не будет в mapе, он начнет ругаться, а если это не так то все равно дублировать контент не хорошо и мы будем дополнительные разы вызывать метод, а он делать нечего не будет. Set нам гарантирует что мы запустим метод строго столько раз сколько у нас есть уникальных повторяющихся имен.
for (Map.Entry<String,String>x:map.entrySet()){
            for (Map.Entry<String,String>y:map.entrySet())
Нечего умнее чем forEach в forEach я придумать не смог. Берем первый элемент mapы и начинаем сравнивать его с каждым элементом mapы.
if (x.getKey()==y.getKey()){
                   continue;
Тут мы делаем проверку. Если key элемента равен key сравниваемого элемента то мы эту итерацию пропускаем. Нам же нужны только повторяющиеся имена. Без этой проверки у нас всегда будет true так как мы можем сравнить элемент сам с собой.
if (x.getValue().equals(y.getValue())){
                        set.add(y.getValue());
Если key разные то сравниваем value. И если они одинаковые то записываем в set наше имя. Обошлись без итераторов на mapе, потому что там как то сложно все.
Артём9 уровень
7 февраля, 11:38
Поправьте меня пожалуйста если я не прав. Когда из метода removeTheFirstNameDuplicates(), мы вызываем метод removeItemFromMapByValue() и в качестве первого параметра передаем наш словарь. Но в самом методе removeItemFromMapByValue() мы уже будем работать с копией нашего словаря, так как при передаче параметра в метод, его значение копируется. Т.е. другими словами в методе removeItemFromMapByValue() мы очищаем не тот словарь, который нам необходимо очищать. Если методу removeTheFirstNameDuplicates() задать возвращаемое значение и в качестве этого возвращаемого значения вывести словарь, то он будет не очищенный.
Richard Hendricks9 уровень, Екатеринбург
8 февраля, 20:52
Вот коммент к следующей задаче нашел, может поможет тебе : а может все таки можно удалить в foreach ? если перед этим создать копию и ходить по ней HashMap<String, Integer> copy = new HashMap<String, Integer>(map); for (Map.Entry<String, Integer> pair: copy.entrySet()) { и если условие true то удалять в той что приходит в аргументах метода map.remove(pair.getKey()); у меня так прошло проверку. ибо ходить по циклу и удалять в нём что то одновременно нельзя(https://javarush.ru/groups/posts/1935-udalenie-ehlementa-iz-spiska-arraylist)
Yan Nezamutdinov8 уровень
12 февраля, 22:18
Не есть так. Мы бегаем быстрым фором (что бы не городить итератор) по копии mapы, но элементы ремуваем в исходном словаре.
Денис8 уровень, Екатеринбург
6 февраля, 18:52
Очень трудная задача, два вечера убил...
Павел13 уровень, Новосибирск
5 февраля, 18:24
Пришлось изрядно подумать, но в итоге решил прибегнуть к помощи дебагера(очень полезная вещь, советую научиться пользоваться), чтобы окончательно разобраться в логике итератора и внутреннего цикла. Сначала метод удалял все значения, пока я не ввел числовую переменную совпадения имен и метод на удаление срабатывал, когда (count>1).
Richard Hendricks9 уровень, Екатеринбург
8 февраля, 20:07
тоже count > 1 использовал и Collections.frequency()
Alex Tiga8 уровень, Казань
5 февраля, 10:11
Люблю JavaRush! Классная задачка! Решение простейшее - в 3 строчки....легко решил всего за 5 часов с помощью подсказок и любимого метода UbeisyaObStenu(); .... создал себе хэшмапу с переменной IgotIt HashMap<Head, Wall, Brain> I got It = new HashMap<>(); ... правда слегка болит голова......но жду прихода понимания . Не забывайте импортировать import java.util.ConcretеWall;
Alexander Korznikov9 уровень, Киев
25 января, 02:18
Мне задача показалась очень сложной, ибо тема MAP Collection не рассматривалась от слова вообще Дали лишь набор методов. Ни слова о вариантах взаимодействия с элементами. В который раз убеждаюсь, что этот сайт годится только как сборник задач, не более.
Павел Гордиевич20 уровень, Минск
22 января, 09:31
Я решил так: значения с МАПА перенес в ArrayLIst потом использовал foreach пробежался по все списку ArrayLIst,одновременно каждое значение сравнивал со всем списком ArrayLIst, если встречалось больше 1 совпадения вызывал removeItemFromMapByValue:)
Yuriy Kulinich10 уровень, Brussels
22 января, 10:00
Решал так же, но долго не мог пройти проверку из-за того, что количество итераций в цикле было задано цифрой, а не через длинну ArrayList.