• ,

package com.javarush.test.level08.lesson08.task05;

   Доброго времени суток, джаварашевцы. Очень не хотелось создавать новый топик по такой изъезженной теме как коллекции, но вижу придется. Помогите пожалуйста разобраться и исправить код. Чувствую, что где-то конкретно затупил, но в упор не вижу. Уже второй день сижу на работе пялюсь и не могу понять, что не так. Ниже я буду выкладывать части кода, и снизу под ними как я понимаю работу оного.

public static void main (String [] args)
    {
        HashMap<String, String> map = createMap();
        removeTheFirstNameDuplicates(map);
        for (Map.Entry<String, String> para : map.entrySet())
        {
            String name = para.getKey();
            String nameTwo = para.getValue();
            System.out.print(name + " " + nameTwo);
            System.out.println(" ");
        }
    }

Вызывается метод createMap, по которому создается карта из десяти людей (фамилия — имя).
Вызывается метод removeTheFirstNameDuplicates(map), с переданной ему в качестве аргумента картой map, далее вывод уже отредактированной map.

public static HashMap<String, String> createMap()
    {
        HashMap<String, String> map = new HashMap<String, String>();
        map.put("Сорока", "Игорь");
        map.put("Петров", "Игорь");
        map.put("Котовский", "Валера");
        map.put("Коновальский", "Валера");
        map.put("Петровский", "Олег");
        map.put("Романчук", "Олег");
        map.put("Корчевский", "Петр");
        map.put("Эндис", "Иван");
        map.put("Нестор", "Иван");
        map.put("Дорн", "Иван");

        return map;

    }

Создается карта из десяти людей, и возвращается карта map.

public static void removeTheFirstNameDuplicates(HashMap<String, String> map)
    {
       HashMap<String, String> copy = new HashMap<String, String>(map);
       for (Map.Entry<String, String> para : copy.entrySet())
       {
           for (Map.Entry<String, String> paraTwo : map.entrySet())
           {
               if (para.getValue().equals(paraTwo.getValue()))
                   removeItemFromMapByValue(map, paraTwo.getValue());
               break;
           }
       }
    }

map копируется в copy.
Первый цикл: получаем пару ключ-значение по copy, далее по внутреннему циклу получаем пару из map, и если значение (имя) в copy эквивалентное значению в map, то вызываем метод removeItemFromMapByValue(map, paraTwo.getValue()) с переданными ему в качестве аргументов value из map и саму map, и выходим из внутреннего цикла, и начинаем первый for заново.

public static void removeItemFromMapByValue(HashMap<String, String> map, String value)
    {
        HashMap<String, String> copy = new HashMap<String, String>(map);
        for (Map.Entry<String, String> pair: copy.entrySet())
        {
            if (pair.getValue().equals(value))
                map.remove(pair.getKey());
        }
    }

В данном методе принимаем map и его value в качестве аргументов.
Создаем копию map, получаем пару из copy, и если value в copy эквивалентно переданному value, то удаляем эту ячейку в карте по ключу. Как бы это смешно не звучало, но я вообще не понял зачем нужно ещё раз создавать копию мэп. Разве нельзя сразу удалить значение в первом методе?

Вывод моего говнокода:

Эндис Иван
Корчевский Петр
Нестор Иван
Дорн Иван

  Если я правильно понял, то когда мы копируем карту, то её копия создается с такими же парами, но в случайном порядке. В методе removeTheFirstNameDuplicates мы берем первую пару из копии, и сравниваем её по-очереди со всеми парами из мэп, и когда находится парами с одинаковыми значениями, то мы вызываем метод removeItemFromMapByValue. В последнем методе мы снова создаем копию мэп, и ищем в ней пару с переданным значением (value), после чего удаляем данную ячейку в мэп. Спасибо за любые подсказки, ссылки на статьи, критику и т.д.

P.S. чувствую что что-то в корне неправильно понял, поэтому мне так тяжело осилить данную задачку.

8 комментариев

snap-buba
HashMap<String,String> copy = map; Так легче сделать

public static void removeTheFirstNameDuplicates(HashMap<String, String> map)
    {
       HashMap<String, String> copy = new HashMap<String, String>(map);
       for (Map.Entry<String, String> para : copy.entrySet())
       {
           for (Map.Entry<String, String> paraTwo : map.entrySet())
           {
               if (para.getValue().equals(paraTwo.getValue()))
                   removeItemFromMapByValue(map, paraTwo.getValue());
               break;
           }
       }
    }

Мне этот блок не нравится т.к он не работает
Swapped
То есть вообще логика ошибочна и его надо переписывать, или можно всё таки что-то изменить?
warks
Копию создавать надо, иначе цикл по коллекции из которой удалили элемент будет работать некорректно.

В вашем коде из map по идее удаляются даже нужные пары, ведь вы удаляете все совпадения.

проще генерировать новую коллекцию. взять массив значений и если значение уникально добавлять его в коллекцию. и ее потом и возвращать
Swapped
Про все совпадения не совсем понял, можно подробнее? На счет генерации новой коллекции: по условию только один метод возвращает значение, и внутри его можно только создавать коллекцию и больше никаких действий.
warks
  • warks
  • +1
  • Комментарий отредактирован 2016-01-14 20:09:51 пользователем warks
У вас два одинаковых HashMap (map и copy). При первой итерации вы берете первые пары из map и copy. И сравниваете значения. Они, естественно, совпадут, и будет удалена уникальная пара. хотя на самом деле, первая пара это уникальная по определению.
warks
  • warks
  • +1
  • Комментарий отредактирован 2016-01-14 20:22:10 пользователем warks
Цикла для решения задачи достаточно одного.
1.Заводите перед циклом промежуточное множество
2.Оргазнизовываем цикл по парам map
3.Для каждого значения pair.getValue проверяете, есть ли он во промежуточном множестве.
3.1 Если такого значения нет, то добавляем его во множество и идем дальше.
3.2 Если значение во множестве есть, то эту пару в copy удаляем
4 возвращаем copy

ЗЫ. Никто не запрещает для решения задачи создавать промежуточные переменные/объекты, главное, чтобы они не были полями класса.
Swapped
Спасибо огромное, теперь всё прояснилось)
Swapped
  • Swapped
  • 0
  • Комментарий отредактирован 2016-01-14 17:50:57 пользователем Swapped
del
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.