com.javarush.test.level08.lesson08.task05

public class Solution
{
    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;
    }

    public static void removeTheFirstNameDuplicates(HashMap<String, String> map)
    {
        HashMap<String,String> copy = new HashMap<String, String>(map);
        Iterator<Map.Entry<String,String>> itr = copy.entrySet().iterator();
        while(itr.hasNext()){
            Map.Entry<String,String> name = itr.next();

            if (copy.containsValue(name.getValue()))
                removeItemFromMapByValue(map,name.getValue());
        }
    }

    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());
        }
    }

    public static void main(String[] args)
    {
        HashMap<String, String> map = createMap();
        removeTheFirstNameDuplicates(map);
        for (Map.Entry<String, String> pair:map.entrySet()){
            String s = pair.getValue();
            System.out.println(s);
        }
    }
}


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

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

FreeSD
Вы создаёте копию мапа, затем перебираете все значения в этой копии и если они совпадают с оригиналом то удаляете их. А так как копия мапа = оригинальному, то и все значения будут совпадать, а значит вы удалите все значения из оригинального мапа
karabash22
  • karabash22
  • 0
  • Комментарий отредактирован 2016-11-13 20:23:50 пользователем karabash22
пробовал так еще, и так же через while с итератором, так просто выводит тот же мэп
<code>for (Map.Entry<String,String> pair : copy.entrySet()) {
            copy.remove(pair.getValue());
            for (Map.Entry<String, String > pair2 : map.entrySet()){
                if (pair.getValue().equals(pair2.getValue()))
                    map.remove(pair2.getValue());
            }
        }</code>
Java-boy
Попробуй создать 2 вложеных цикла фор-ич, которые будут прогонять один и тот же мэп и создай счетчик, сделай проверку на имена и если совпадают — увеличивай счетчик на 1, если счетчик будет больше 1, тогда удаляй(только удаляй через итератор)
и у тебя имена добавлены как ключи, насколько я помню они должны быть значениями.
karabash22
это да, ну проверяю то я по value.
решение со счетчиком не пробовал, но видел, попробую
karabash22
  • karabash22
  • 0
  • Комментарий отредактирован 2016-11-16 16:58:01 пользователем karabash22
я сдаюсь, вроде должно работать, но не удаляет значения. И это не первый способ решения этой задачи
public class Solution
{
    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;
    }

    public static void removeTheFirstNameDuplicates(HashMap<String, String> map)
    {
        HashSet<String> copy = new HashSet<String>();
       for (Map.Entry<String,String> pair : map.entrySet())
       {
         
               if (!copy.contains(pair.getValue()))
                   copy.add(pair.getValue());
               else if (copy.contains(pair.getValue()))
                   map.remove(pair.getValue());

           
       }

    }

    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: map.entrySet())
        {
            if (pair.getValue().equals(value))
                map.remove(pair.getKey());
        }
    }

    public static void main(String[] args)
    {
        HashMap<String, String> map = createMap();
        removeTheFirstNameDuplicates(map);
       for (Map.Entry<String, String> pair:map.entrySet()){
            String s = pair.getValue();
            System.out.println(s);
        }

    }
}
Java-boy
  • Java-boy
  • 0
  • Комментарий отредактирован 2016-11-16 20:20:59 пользователем Java-boy
public static void removeTheFirstNameDuplicates(HashMap<String, String> map)
    {
        HashSet<String> copy = new HashSet<String>(); //он по сути не нужен
       for (Map.Entry<String,String> pair : map.entrySet())
       {
         
               if (!copy.contains(pair.getValue()))
                   copy.add(pair.getValue());
               else if (copy.contains(pair.getValue()))//первые значения не удалятся
                   map.remove(pair.getValue()); //плохо удаляй через итератор(элементы удаляются по ключу, а не по значению, смотри метод удаления, который тебе дали)
       }
    }

Как я уже писал, используй счетчик и удаляй либо через итератор либо через метод который тебе дали
public static void removeItemFromMapByValue(HashMap<String, String> map, String value)
karabash22
  • karabash22
  • 0
  • Комментарий отредактирован 2016-11-17 18:32:27 пользователем karabash22
написал с нуля, удаляю через итератор, работает, но не принимает.
Через removeItemFromMapByValues вылезает concurent modificator error
<code>public class Solution
{
    public static void main(String[] args)
    {
        HashMap<String,String> map = createMap();
        removeTheFirstNameDuplicates(map);
        for (String s:map.values()){
            System.out.println(s);
        }
    }
    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;

    }

    public static void removeTheFirstNameDuplicates(HashMap<String, String> map)
    {
        Set<String > set = new HashSet<String>();
        Iterator<String> itr = map.values().iterator();
        while (itr.hasNext()){
            String pair = itr.next();
            if(set.contains(pair))
                itr.remove();
            else set.add(pair);
        }

    }

    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());
        }
    }
}</code>
karabash22
  • karabash22
  • 0
  • Комментарий отредактирован 2016-11-17 18:37:31 пользователем karabash22
понял ошибку, решил созданием копии map. c 22 попытки XD. Странно, что при прошлых попытках такого решения вылезал concurent modificator error
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.