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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 28.02.2016, 17:41   #11
Kokarnit
 
Регистрация: 08.08.2014
Сообщений: 7
По умолчанию

Я конечно не жабер а шарпер но однозначно знаю что в джаве как и в шарпе нельзя проходиться по элементам коллекции при помощи итератора и одновременно изменять эту коллекцию (т.е добавлять и удалять изменяя порядок элементов). Я
бы посоветовал сначала брать значения твоего хэшсета в список строк как то так:
Код:
List<String> names = new ArrayList<String>(map.values());
Дальше искать в этом списке names дубликаты и удалять их из твоего хэшсета. И можно все это написать покомпактнее чем ты привел .

Кстати :

Код:
    public static void main(String[] args)
    {
        HashMap<String , String> map = createMap();
        removeTheFirstNameDuplicates(map); //map передан по значению , исходный map не будет меняться
        System.out.println(map);
    }
Разве в java можно передавать по ссылке ? Ведь фактически поcле передачи map в метод removeTheFirstNameDuplicates исходный HashMap не будет меняться и будет выведен первоначальный хэшмап.
Скорее надо так:
Код:
    public static void main(String[] args)
    {
        HashMap<String , String> map = createMap();
        map = removeTheFirstNameDuplicates(map); //map присвоена ссылка на новый "обработынный" методом класс
        System.out.println(map);
    }

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

Kokarnit, благодарю за такой развернутый и доходчивый ответ, все по делу и очень ясно.
nevender вне форума Ответить с цитированием
Старый 28.02.2016, 18:36   #13
nevender
Пользователь
 
Регистрация: 03.01.2016
Сообщений: 59
По умолчанию

Цитата:
Сообщение от Kokarnit Посмотреть сообщение
в джаве как и в шарпе нельзя проходиться по элементам коллекции при помощи итератора и одновременно изменять эту коллекцию (т.е добавлять и удалять изменяя порядок элементов)
Даже если только 1 итератор?

Цитата:
Сообщение от Kokarnit Посмотреть сообщение
Дальше искать в этом списке names дубликаты и удалять их из твоего хэшсета.
Чтобы перебирать значения хэшсета нужно использовать итератор либо for each, но он ведь тоже использует итераторы, но неявно.
Как сделать то что в цитате?

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

Код:
import java.util.ArrayList;
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();
        map = 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 HashMap<String, String> removeTheFirstNameDuplicates(HashMap<String, String> map)
    {
        //напишите тут ваш код
        Iterator<Map.Entry<String, String>> iterator1 = map.entrySet().iterator();
        Iterator<Map.Entry<String, String>> iterator2 = map.entrySet().iterator();

        ArrayList<String> list = new ArrayList<String>(map.values());

        int n=0;

        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) list.add(pair1.getValue());
        }

        Iterator<Map.Entry<String, String>> iterator3 = map.entrySet().iterator();

        while (iterator3.hasNext())
        {
            Map.Entry<String, String> pair3 = iterator3.next();
            String key3 = pair3.getKey();
            String value3 = pair3.getValue();

            for (int i = 0; i < list.size(); i++)
            {
                if (value3.equals(list.get(i))) map.remove(key3);
            }
        }

        return map;
    }

    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, 20:44   #14
Kokarnit
 
Регистрация: 08.08.2014
Сообщений: 7
По умолчанию

Код:
package dictionarysample;
import java.util.*;

public class DictionarySample {


    public static void main(String[] args) {
        HashMap<String , String> map = createMap();
        map = removeTheFirstNameDuplicates(map);
        System.out.println(map);
    }
    
    public static HashMap<String, String> createMap()
    {
        //напишите тут ваш код
        HashMap<String, String > map = new HashMap<String ,String>();
        
        map.put("Durak","Sasha");
        map.put("Umniy","Misha");
        map.put("Bogatiy","Aleksey");
        map.put("Programmist","Misha");
        
        return map;
    }

    public static HashMap<String, String> removeTheFirstNameDuplicates(HashMap<String, String> map)
    {
        ArrayList<String> names = new ArrayList<String>(map.values());
        int duplicatesCount = 0;
        
        for(int i=0;i<names.size();i++)
        {
         duplicatesCount = getListDuplicateItemsCount(names,names.get(i));
         if(duplicatesCount>0)
         {
          for(int j=0 ; j<duplicatesCount ; j++)
          {
            Iterator<Map.Entry<String, String>> namesIterator = map.entrySet().iterator();
            while(namesIterator.hasNext())
            {
             Map.Entry<String, String> namesItem = namesIterator.next();
             if(namesItem.getValue().equals(names.get(j)))
             {
              namesIterator.remove();
              names.remove(i);
              break;
             }
            }
          }
         }
        }
        return map;
    }

    public static int getListDuplicateItemsCount(ArrayList<String> sourceList, String itemValue)
    {
        int duplicateCount = 0;
        
        for(String listItem:sourceList)
        {
         if(listItem.equals(itemValue)) duplicateCount++;
        }
        
        duplicateCount--; //Чтобы не считать первое совпадение дубликатом
        
        return duplicateCount;
    }
    
}
Или через инверсию :

Код:
package dictionarysample;
import java.util.*;

public class DictionarySample {

    public static void main(String[] args) {
      HashMap<String , String> map = new HashMap<String ,String>(); 
      map.put("Durak","Sasha");
      map.put("Umniy","Misha");
      map.put("Bogatiy","Aleksey");
      map.put("Programmist","Misha");    
      map = inverseHashMap(map); 
      System.out.println(map);
    }
    
    private static HashMap<String,String> inverseHashMap(HashMap<String,String> map)
    {
      HashMap<String, String> inversedMap = new HashMap<String,String>();
      for(Map.Entry<String,String> val :map.entrySet())
      {
       inversedMap.put(val.getValue(), val.getKey());
      }
      return inversedMap;
    }
}

Последний раз редактировалось Kokarnit; 28.02.2016 в 22:23.
Kokarnit вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 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