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

  • 10
  • Недоступна
Сложно представить себе ситуацию, в которой может понадобиться программа, которую мы предлагаем вам написать. Впрочем, маленькая модификация, и она обретает практический смысл. Также её можно представить частью чего-то большего (поиска?). Давайте создим словарь, занесём в него записи по принципу «фамилия» - «имя» и удалим людей с одинаковыми именами.
Вы не можете решать эту задачу, т.к. не залогинены.
Комментарии (328)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий вы должны авторизоваться
Dan Banan8 уровень, Великий Новгород
3 часа назад
Тоже решил задачу через списки, может кто-то объяснить почему такая конструкция не сработала?
public static void removeTheFirstNameDuplicates(Map<String, String> map) {
        //напишите тут ваш код
        String value;
        int cntr=0;

        for(Map.Entry<String, String> i : map.entrySet()){

            value = i.getValue();

            for(Map.Entry<String, String> j : map.entrySet()){
                if(j.getValue().equals(value)){
                    cntr++;
                }
            }
            if(cntr>=2){
                removeItemFromMapByValue(map, value);
                cntr = 0;
            } else{
                cntr = 0;
            }
        }
    }
Колян Мельников8 уровень, Минск
четверг, 21:59
ааааа….8 попыток!!! чувствую себя не очень приятно!!! хотя с другой стороны решил сам и без подсказок, в принципе тоже результат. Решал через 2 List и счетчик. В первый List через фор загнал значения map. Затем через двойной фор и счетчик проверил повторение каждого элемента (через equals) в списке, и если повторений больше 1, то добавлял этот элемент во второй список, а дальше в метод emoveItemFromMapByValue вписываем через for каждый элемент второго списка, типа (map, List.get(i)) и все. Несколько часов ломал себе мозг, а в итоге все оказалось просто.
Евгений Волков8 уровень, Санкт-Петербург
четверг, 15:24
Создал два дополнительных ArrayList(): в первый положил все values из HashMap, подсчитал в нем число вхождений каждого элемента с помощью Collections.frequency. Те значения число вхождений которых >2 положил во второй ArrayList(). Дальше просто удаляем из HashMap все значения которые вошли во второй ArrayList().
Сергей8 уровень, Минск
среда, 09:47
Я лучше чем 1% учеников. И с 39 попытки. Но столько узнал о себе и о коллекциях ))
omat_kisat10 уровень, MIPS Assembly
среда, 08:00
Всем, кто страдает от итераторов, связанных списков, словарей и прочих коллекций, настоятельно рекомендуется к прочтению книга Introduction to Algorithms (Thomas Cormen).
omat_kisat10 уровень, MIPS Assembly
среда, 07:48
Великолепная задача! Мое решение завалидировалось с первой попытки, однако, возможно, оно не самое эффективное. Хоть и надежное. Итак, что было сделано: при проходе по исходному словарю создается хэшмэп типа <String, Boolean>, куда в качестве ключей передаются значения из исходного словаря. Если в новой мапе такой ключ есть, булево значение устанавливается на true, если нет – то false. Далее итерируем по новой мапе, и если булево значение true, тогда передаем этот ключ в качестве строки (вместе с исходным словарем) в метод для удаления. Но можно было, наверное, сделать и по-другому – за одну итерацию: значение из исходного словаря добавляем в хэшсет, и если оно уже там есть, передаем его в качестве строки в метод для удаления. У кого удастся такое завалидировать, отпишитесь, пожалуйста, не выпадет ли ConcurrentModificationException, что вполне вероятно. Если кто хотел узнать, почему это происходит: итератор из класса Iterator() не может модифицировать коллекцию, он может только по ней ходить. Поэтому удалять из одной коллекции можно при итерации по другой коллекции. Или через предикаты в методе removeIf(), но это уже совсем другая история.
Алексей Васильевич16 уровень, Алматы
1 августа, 08:51
Вопрос по удалению нескольких элементов из HashMap, по идее через итератор должно бы работать но выдает ошибку java.util.ConcurrentModificationException после удаления первого элемента и попытки доступа к следующему. В итоге пришлось применять костыли. Но как удалять несколько элементов из HashMap через Iterator?
ДМИТРИЙ9 уровень, Белгород
4 августа, 20:40
Такая же штука. Вернусь после исключений. Пробовал тестить решение, но прога выдает ошибку после того, как находит повтор в значениях.
Venitarx13 уровень, Москва
9 августа, 20:23
В HashMap нельзя одновременно перебирать значения и удалять, поэтому в методе removeItemFromMapByValue заведена копия Map: перебирается копия, а удаляется из оригинала.
omat_kisat10 уровень, MIPS Assembly
среда, 07:57
Исключение выдает не мапа, а Iterator() – это его особенность. В Java объекты этого класса не могут модифицировать коллекции, они нужны только для прохода по ним (по всем кроме собственно Array). У них есть два основных метода: next(), который возвращает следующий элемент коллекции (либо просто следующий, либо на ваших условиях, если вы его override), а также булев hasNext(), который сообщает, дошли вы до конца коллекции или нет. Соответственно, когда вы итератором пытаетесь удалять или добавлять элементы, всегда будет выпадать исключение. Выход: создать другую коллекцию и удалять элементы при итерации по ней. Второй выход: удалять по предикатам без итерации с помощью метода removeIf(), но здесь для решения он не подойдет.
steff10 уровень
24 июля, 13:14
Не совсем хард, но есть над чем задуматься. Жаль что приходится копировать в списки.
IhorTsalko11 уровень, Минск
24 июля, 12:08
Хотелось бы узнать, может есть какой то способ перебора множества без копирования его в списки. Т.е. чтобы каким то способом сравнить, есть ли повторения в значения Map или Set
Olha Pokotylo8 уровень, Киев
15 июля, 20:20
Вторые сутки над этой задачей кручусь, пока бесполезно. Есть смысл пока пропустить и позже вернуться к этой задаче? Или все-таки это обязательно нужно понять прямо сейчас?
Bel_Ami18 уровень
18 июля, 09:20
есть