Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Java программирование > Общие вопросы по Java, Java SE, Kotlin
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.02.2016, 12:51   #1
nevender
Пользователь
 
Регистрация: 03.01.2016
Сообщений: 59
По умолчанию Java. Коллекция Map. Удаление одинаковых значений.

Код:
package com.*

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

/* Удалить людей, имеющих одинаковые имена
Создать словарь (Map<String, String>) занести в него десять записей по принципу «фамилия» - «имя».
Удалить людей, имеющих одинаковые имена.
*/

public class Solution
{
    public static void main(String[] args)
    {
        HashMap<String , String> map = createMap();
        removeTheFirstNameDuplicates(map);
        System.out.println(map);
    }

    public static HashMap<String, String> createMap()
    {
        HashMap<String, String > map = new HashMap<String ,String>();

        for (int i = 0; i <9 ; i++)
        {
            map.put(""+i,"a");
        }
        map.put("9","aa");
        
        return map;
    }

    public static void removeTheFirstNameDuplicates(HashMap<String, String> map)
    {
        Iterator<Map.Entry<String, String>> iterator1 = map.entrySet().iterator();
        Iterator<Map.Entry<String, String>> iterator2 = map.entrySet().iterator();
        int n=0; // счетчик, он минимум будет равен 1 если нет повторений.
        while (iterator1.hasNext())
        {
            Map.Entry<String, String> pair1 = iterator1.next();
            String key1 = pair1.getKey();
            String value1 = pair1.getValue();


            while (iterator2.hasNext())
            {
                Map.Entry<String ,String> pair2 = iterator2.next();
                String key2 = pair2.getKey();
                String value2 = pair2.getValue();

                if (value1.equals(value2)) n++;

            }
            if (n>1) removeItemFromMapByValue(map,value1); // использую метод для удаления повторяющихся имен


        }

    }

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

Последний раз редактировалось nevender; 28.02.2016 в 12:53.
nevender вне форума Ответить с цитированием
Старый 28.02.2016, 12:54   #2
nevender
Пользователь
 
Регистрация: 03.01.2016
Сообщений: 59
По умолчанию

Проблема в том, что у меня программа не компилируется. Укажите, пожалуйста, на мою ошибку.

Что мне выдает Java во время компиляции на Intellij IDEA:

Exception in thread "main" java.util.ConcurrentModificationExc eption
at java.util.HashMap$HashIterator.next Node(HashMap.java:1429)
at java.util.HashMap$EntryIterator.nex t(HashMap.java:1463)
at java.util.HashMap$EntryIterator.nex t(HashMap.java:1461)
at com.javarush.test.level08.lesson08. task05.Solution.removeTheFirstNameD uplicates(Solution.java:45)
at com.javarush.test.level08.lesson08. task05.Solution.main(Solution.java: 17)
at sun.reflect.NativeMethodAccessorImp l.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImp l.invoke(NativeMethodAccessorImpl.j ava:62)
at sun.reflect.DelegatingMethodAccesso rImpl.invoke(DelegatingMethodAccess orImpl.java:43)
at java.lang.reflect.Method.invoke(Met hod.java:497)
at com.intellij.rt.execution.applicati on.AppMain.main(AppMain.java:144)

Process finished with exit code 1
nevender вне форума Ответить с цитированием
Старый 28.02.2016, 13:05   #3
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Exception это не "во время компиляции", а во время работы программы.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 28.02.2016, 13:07   #4
nevender
Пользователь
 
Регистрация: 03.01.2016
Сообщений: 59
По умолчанию

Благодарю, буду знать.
Скажите, пожалуйста, Вы смогли найти ошибку? Расскажите мне в чем она?
nevender вне форума Ответить с цитированием
Старый 28.02.2016, 13:13   #5
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Гуглите название экзепшна (ConcurrentModificationException)

Видимо в том, что тут два итератора на одну и ту же коллекцию и после удаления элемента через один из них пытаетесь продолжить чтение через другой.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 28.02.2016, 13:35   #6
Bugrimov
C/C++, Java
Участник клуба
 
Аватар для Bugrimov
 
Регистрация: 28.03.2012
Сообщений: 1,680
По умолчанию

А почему это сделано именно так... ??
Код:
  public static void main(String[] args)
    {
        HashMap<String , String> map = createMap();
        removeTheFirstNameDuplicates(map);
        System.out.println(map);
    }

    public static HashMap<String, String> createMap()
    {
        HashMap<String, String > map = new HashMap<String ,String>();

        for (int i = 0; i <9 ; i++)
        {
            map.put(""+i,"a");
        }
        map.put("9","aa");
        
        return map;
    }
"Keep it simple" - придерживайтесь простоты!
Уильям Оккам - "Не следует множить сущее без необходимости"
Сложность - враг простоты и удобства!
Bugrimov вне форума Ответить с цитированием
Старый 28.02.2016, 13:54   #7
nevender
Пользователь
 
Регистрация: 03.01.2016
Сообщений: 59
По умолчанию

В главном методе решение, т.е. выполнение следующих действий:
1. Создать словарь (Map<String, String>) занести в него десять записей по принципу «фамилия» - «имя».
2.Удалить людей, имеющих одинаковые имена.
3. Вывод(проверка)

Касаемо заполнения карты(словаря), то просто заполнил на скорую руку, ибо ручной ввод довольно-таки громаден и нужно туда-сюда передвигать курсор и менять ключи и значения. Утомительно.)
nevender вне форума Ответить с цитированием
Старый 28.02.2016, 14:57   #8
Bugrimov
C/C++, Java
Участник клуба
 
Аватар для Bugrimov
 
Регистрация: 28.03.2012
Сообщений: 1,680
По умолчанию

Где-то мне этот чудо код на глаза попадался....
"Keep it simple" - придерживайтесь простоты!
Уильям Оккам - "Не следует множить сущее без необходимости"
Сложность - враг простоты и удобства!
Bugrimov вне форума Ответить с цитированием
Старый 28.02.2016, 15:31   #9
nevender
Пользователь
 
Регистрация: 03.01.2016
Сообщений: 59
По умолчанию

Alex11223, т.е. лучше вначале запихнуть в отдельный список строк, затем когда сохранятся все повторяющиеся значения и 2 итератора закончат работу, отдельным 1 итератором сравнивать значения со списком строк и удалять?

Bugrimov, верю это пример с JavaRush, изучаю ЯП Java на этом сайте

Последний раз редактировалось nevender; 28.02.2016 в 15:34.
nevender вне форума Ответить с цитированием
Старый 28.02.2016, 15:58   #10
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Я не говорил что лучше, я говорил как нельзя.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ЯП JAva. Коллекция Map. Как сделать ключ "не уникальным"? nevender Общие вопросы по Java, Java SE, Kotlin 4 28.02.2016 00:43
Удаление одинаковых значений с массива. RTFM Microsoft Office Excel 34 15.10.2013 09:28
Отброс одинаковых значений ZanderBlack1 Microsoft Office Excel 2 02.02.2011 20:13
Нахождение одинаковых значений NoLL Microsoft Office Excel 5 17.11.2010 15:38
Замена одинаковых значений Ярик 555 Microsoft Office Excel 6 09.02.2010 04:50