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

  • 10
  • Недоступна
Сложно представить себе ситуацию, в которой может понадобиться программа, которую мы предлагаем вам написать. Впрочем, маленькая модификация, и она обретает практический смысл. Также её можно представить частью чего-то большего (поиска?). Давайте создим словарь, занесём в него записи по принципу «фамилия» - «имя» и удалим людей с одинаковыми именами.
Вы не можете решать эту задачу, т.к. не залогинены.
Комментарии (620)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий вы должны авторизоваться
nikolay8 уровень
Tuesday, 07:59
Сделал дополнительный список. Через цикл в цикле перебрал, сравнивая элементы списка. Нужно исключить последствия сравнения самих с собой. Одинаковые строки присвоил переменной value(все это внутри цикла в цикла), так как она передается в качестве аргумента в метод удаления-((map,value)), и вызываем готовый метод удаления.
Антон12 уровень, Санкт-Петербург
3 July, 17:10
3 часа, Карл! Но таки её сделал. У меня, наверное, соседи начали заикаться от моего торжествующего вопля )))
Dator18 уровень, Киев
27 June, 20:05
Задачка со звездочкой. После решения всех проблем валидатор не пропускает. Метод createMap() должен создавать и возвращать словарь Map с типом элементов String, String состоящих из 10 записей. У меня 10 раз забито
map.put("Петечкин1","Вася");
с разными ключами и иногда повторяющимися именами. Как бороться?
Dator18 уровень, Киев
27 June, 20:14
Нашел в чем боль.
public static Map<String, String> createMap()
Вызывал следующий по очереди метод.... Довольно странно что такое не пропустило.
Дмитрий9 уровень
26 June, 10:43
Каким то чудом вспомнилось, что set может хранить только уникальные элементы. Я сначала создал лист, в который занес все value, потом двойным циклом прошерстил его на повторы for (int i = 0; i < list.size()-1; i++) for (int x = i+1; x < list.size(); x++) и при каждом обнаружении повтора, заносил текущее значение в set, затем еще одним циклом по каждому значению set вызывал метод удаления. Длинно, топорно, как и положено салаге, но сработало.
Max Pankov15 уровень, Москва
23 June, 20:23
Единственная задача, на которую я потратил овер2часа. Как только не пробовал. Мб кому поможет. Если вы действуете через ЦИКЛ в ЦИКЛЕ, то, когда сравниваете значения VALUE, напишите так же, что вызов метода НЕ должен проходить, если KEY = KEY. Просидел на этом кучу времени. Счастья вагон после решения))
Людмила11 уровень, Санкт-Петербург
20 June, 18:00
Я никак не могла понять, как мне проверить лист на дубликаты! А это старый-добрый цикл в цикле следующего вида for(int g = 0; g < list.size(); g++){ for(int b = 0; b < g; b++){ , о котором я постоянно забываю. Перед этим циклом создаем лист, копируем туда все map.values(). Ну и если дубликаты есть, удаляем. Как всегда, когда уже все решишь, кажется, что это легко) Но как же долго я страдала )) Теперь запомню это навсегда👹
Дмитрий18 уровень, Киев
22 June, 11:12
Добрый день, я скорей всего ошибаюсь, но логику работы этих двух циклов я понял так, одинаковые имена удаляются в том случае, если они стоят рядом, буду благодарен если объясните поподробней, ибо до конца не могу разобраться с этим заданием, уже сижу с ручкой и листиком, заранее спасибо;)
Александр10 уровень, Минск
14 June, 15:09
Объясните немного недалекому, что по итогу мы должны в этой задаче делать, если один из методов уже удаляет?
Юрий9 уровень
16 June, 11:59
Метод removeItemFromMapByValue удаляет из HashMap строку которую мы ему передаем в качестве аргумента String value. А в методе removeTheFirstNameDuplicates мы как раз и должны создать этот список строк String (имен которые повторяются). Который в последствие мы будем использовать для удаления имен которые повторяются.
AndyS15 уровень, Москва
8 June, 00:37
По-моему, всё немного проще: создаем копию Мапы и поочередно удаляем в ней каждое значение итератором через remove(), проверяем, остается ли еще такое значение в этой копии Мапы фукнцией containsValue(). Если остается - значит, удаляем это значение в оригинальной Мапе.
Юрий Лубенченко16 уровень, Киев
4 June, 09:59
Достаточно одного "for" с "if" для решения, но перед этим: - создаем список значений карты; - вот этот маленький маневр "Collections.sort(value);" выстроит список так, что все повторяющиеся элементы встанут рядом. Затем, как было написано сразу, перебираем список в "for" на одинаковые значения и обращаемся к "removeItemFromMapByValue()" с совпавшим элементом. Надеюсь, что поможет, так как тут многие пошли длинными путями...
Ivan Matveenko22 уровень, Омск
6 June, 21:19
thanks
Анон12 уровень, Харьков
10 June, 12:21
Юрий, кмк, всё хорошо в Вашем варианте, кроме масштабируемости. Словарь на миллионы записей тоже сортировать планируете?
Юрий Лубенченко16 уровень, Киев
10 June, 19:55
Анон, я увидел для себя достаточно простой способ решения этой задачи, с картой на 10 записей. Также обратил внимание, что у многих эта задача туго идет. Потому и был предложен этот вариант. Я учусь здесь с абсолютного нуля и никогда не сталкивался с проблемой масштабируемости)) Буду рад если изложите оптимальный, на Ваш взгляд, вариант для карты любого размера.
Анон12 уровень, Харьков
10 June, 20:09
Сделать строковый массив значений карты? Дальше не скажу, т.к. зависит от остальной реализации, мне неизвестной. Простой способ, который нормально так нагрузит, это ближе к "поделке", не надо так. П.С. Я ничего не утверждаю, сам только учусь. Так что это imho (именно imho, не имхо :).
Alexander12 уровень, Днепр
13 June, 10:46
Можно и без сортироовки, просто добавляем еще один фор для перебора совпадений в листе, как только совпадение найдено, запускаем метод удаления из мап, после чего еще одним фором очищаем лист от оставшихся совпадений дабы не запускать впустую метод очистки мап и брейкаем предыдущий фор. Вот вам и масштабируемость и даже оптимизация)) Могу в личку код скинуть, если кому интересно)
Анон12 уровень, Харьков
13 June, 10:51
Совсем другое дело, мсьё!) Особенно, что учтено "после чего еще одним фором очищаем лист от оставшихся совпадений дабы не запускать впустую метод очистки мап" (я планировал на этом "коварно подловить") 🙏👍🥳
Verhun Kyrylo17 уровень
3 June, 14:53
Что то ничего не понятно. Думал решать задачу так же как и предыдущую. По копии map пройтись и удалить с оригинала. Но в условии задачи написано что removeTheFirstNameDuplicates() должен вызывать метод removeItemFromMapByValue() в котором как раз и прописано удаление дубликатов имен. Так к чему задача сводится, к заполнению мапа и вызову метода? Сделал так. Проверку не проходит по 3 пункту. Какое то странное условие задачи.
Петр8 уровень, Санкт-Петербург
4 June, 05:57
Тут несколько задач: 1. Написать метод удаления записи из мапы по значению, а не по ключу (тут нужен цикл с обходом всех записей и сравнение с целевым значением). 2. Использовать этот метод для удаления записей, где значение не уникально (есть дубликаты) — для этого лично я прошелся по оригинальной мапе и записал дубликаты в новую мапу по схеме "Имя" -> <встречающееся число раз>, затем использовал эту мапу чтобы очистить оригинальную.
AndyS15 уровень, Москва
8 June, 00:34
> 1. Написать метод удаления записи из мапы по значению Так он написан самими авторами. :)