@tamogavk
@deni4ka

Не доходит до меня тема коллекций, что я не так решаю?

Здравствуйте, не доходит до меня тема по коллекциям в Java, а конкретно HashMap, не могу решить задачу, вот условие: удалить людей имеющих одинаковые имена, вот код шаблона куда нужно вставить решение :
public class Main{
		public static HashMap<String,String> createMap(){
			HashMap<String,String> map = new HashMap();
			map.put("Иванов", "Иван"); 
			map.put("Пупкин", "Вася");
			map.put("Коваленко", "Петя");
			map.put("Лубнов", "Иван");  
			return map;
		}
		public static void removeTheFirstNameDuplicates(HashMap<String,String>map){
			
		//сюда надо вставить решение 
		}
		public static void removeItemFromMapByValue(HashMap<String,String>map,String value){
			HashMap<String,String>copy = new HashMap(map);
			for(Map.Entry<String, String> pair: copy.entrySet()){
				if(pair.getValue().equals(value)){
					map.remove(pair.getKey());
				}
			}
		}

Вот собственно решение каким его вижу я
public static void removeTheFirstNameDuplicates(HashMap<String,String>map){
			HashMap <String,String> map2 = new HashMap(map);
			HashMap <String,String> map3 = new HashMap(map);
			
			for(Map.Entry<String, String> pair : map2.entrySet()){
				for(Map.Entry<String, String>pair1 :map3.entrySet()){
					if(pair.equals(pair1.getValue())){
						removeItemFromMapByValue(map,pair.getValue());
					}
				}
			}
			
		}

Пожалуйста научите,что я делаю не так?очень хочу стать программистом! заранее благодарен!
  • Вопрос задан
  • 4041 просмотр
Решения вопроса 1
@tamogavk Автор вопроса
@deni4ka
Решил:
public static void removeTheFirstNameDuplicates(HashMap<String,String>map){
			 HashMap<String, String> copy1 = new HashMap<String, String>(map);
		        HashMap<String, String> copy2 = new HashMap<String, String>(map);
		        for (Map.Entry<String, String> pair1: copy1.entrySet())
		        {
		            int count = 0;
		            for (Map.Entry<String, String> pair2: copy2.entrySet()) {
		                if (pair1.getValue().equals(pair2.getValue())) {
		                    count++;
		                }
		            }
		            if (count > 1) {
		                removeItemFromMapByValue(map, pair1.getValue());
		            }
		        }
		    }
Ответ написан
Пригласить эксперта
Ответы на вопрос 6
evnuh
@evnuh
Поиск Гугл помог мне, впусти и ты его в свой дом
Если задача на хешмепы, то с помощью них и надо решать. Проходите по данному хешмепу, для каждого имени из него прибавляете 1 к значению в другом хешмепе, ключомв которым и будет имя. Далее проходите по новому хешмепу и если значение у него > 1 то из старого удаляете элементы со значением равным текущему ключу.
Ответ написан
Комментировать
@lslayer
Программист и сисадмин
Два варианта.
1. Лобовой. Двойной цикл, сравнивать каждый с каждым, если равны - один удалять.
2. Переместить все в Set, он автоматически удалит дубликаты, переместить обратно.
Ответ написан
Mrrl
@Mrrl
Заводчик кардиганов
А вам нужно удалить всех людей, или одного оставить?
Во втором случае накапливаете множество имён, и если у очередного человека имя принадлежит множеству, его удаляете. Если не принадлежит - добавляете в множество имён.
Если надо удалить всех Иванов:
- заводите два множества: имена, которые встретились, и имена, которые встретились более одного раза.
- в цикле по таблице: если очередного имени в первом множестве нет, добавляете его туда, а если есть - добавляете во второе множество.
- удаляете из таблицы всех людей, имена которых есть во втором множестве.
Ответ написан
@landstalker
Я похожую делал недавно на chekio , на питоне.... но там сразу был лист сетов и из него нужно было удалить данный сет. Множества (set) вобще удобная штука, для некоторых задач, в данном случае должно помочь.
Ответ написан
Комментировать
@gurinderu
java developer
public class Main {
  public static Map<String, String> usersMap = new LinkedHashMap<String, String>() {{
        put("Иванов", "Иван");
        put("Пупкин", "Вася");
        put("Коваленко", "Петя");
        put("Лубнов", "Иван");
    }};

    public static void main(String[] args) {
        Set<String> names = new HashSet<String>();
        for (Iterator<Map.Entry<String, String>> iterator = usersMap.entrySet().iterator(); iterator.hasNext(); ) {
            Map.Entry<String, String> next = iterator.next();
            if (names.contains(next.getValue())) {
                iterator.remove();
            } else {
                names.add(next.getValue());
            }
        }
        System.out.println(usersMap);
    }
}
Ответ написан
@cane
public class ReplaceFromMapTest {
	public static void main(String[] args) {
		if(deleteNamesake(getNames())) {
			System.out.println("люди с одинаковыми именами были удалены из \"списка\".");
		}
	}
	
	public static Map<String, String> getNames() {
		Map<String, String> names = new HashMap<String, String>();
		names.put("Иванов", "Иван");
		names.put("Пупкин", "Вася");
		names.put("Коваленко", "Петя");
		names.put("Лубнов", "Иван");
		return names;
	}
	
	public static boolean deleteNamesake(Map<String, String> names) {
		boolean result = false;
		Collection<String> allFirstNames = names.values();
		Set<String> delNames = new HashSet<String>();
		for(Map.Entry<String, String> p : names.entrySet()) {
			if(Collections.frequency(allFirstNames, p.getValue()) > 1) {
				delNames.add(p.getKey());
			}
		}
		if(delNames.size() > 0) {
			for(String n : delNames) {
				names.remove(n);
				result = true;
			}
		}
		return result;
	}
}


Только я бы не использовал в HashMap фамилии людей в качестве ключей, большая вероятность совпадений.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы