Не понимаю где я ошибся в задании на HashMap

262
14 июня 2017, 01:16

Написал код, вроде рабочий, но не принимает проверка JavaRush, в итоге переделал элегантно и правильно, но не могу понять ГДЕ ошибка. Вроде же всё должно работать. Понимаю, что подход у меня, кхм, интересный, но по моему мнению он должен работать.

Задача такая:

  1. в методе СreateMap создать HashMap<String, String>
  2. в методе removeTheFirstNameDuplicates провести поиск и удаление совпадающих значений
  3. используя метод removeItemFromMapByValue (он уже был готов согласно условию задачи)

Ошибку IntelliJ Idea не выдаёт, вроде всё работает, но валидатор JavaRush не принимает (просто Ваша задача не прошла тестирование). Я подозреваю два варианта - либо я молодец, а валидатор нет. Либо я по неопытности что-то сделал не так.

public static HashMap<String, String> createMap() {
    HashMap<String, String> map = new HashMap<>();
    map.put("К1", "И1");
    map.put("К2", "И2");
    map.put("К3", "И3");
    map.put("К4", "И4");
    map.put("К5", "И5");
    map.put("К6", "И1");
    map.put("К7", "И7");
    map.put("К8", "И8");
    map.put("К9", "И9");
    map.put("К10", "И10");
    return map;
}
public static void removeTheFirstNameDuplicates(HashMap<String, String> map) {
    ArrayList<String> list = new ArrayList<>();
    Iterator<Map.Entry<String, String>> iter = map.entrySet().iterator();
    while (iter.hasNext()) {
        Map.Entry<String, String> pair = iter.next();
        list.add(pair.getValue());
    }
    HashMap<String, String> copy = new HashMap<>(map);
    Iterator<Map.Entry<String, String>> it2 = copy.entrySet().iterator();
    while (it2.hasNext()) {
        Map.Entry<String, String> pair2 = it2.next();
        String smap = pair2.getValue();
        for (int i = 0; i < list.size(); i++) {
            String sarr = list.get(i);
            if (smap.equals(sarr)) {
                removeItemFromMapByValue(map, smap);
            }
        }
    }
}
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) {}
Answer 1

В результате такой итерации вы удалите вообще все вхождения в map:

На этом этапе вы заполняете список значениями из мапы

ArrayList<String> list = new ArrayList<>();
Iterator<Map.Entry<String, String>> iter = map.entrySet().iterator();
while (iter.hasNext()) {
    Map.Entry<String, String> pair = iter.next();
    list.add(pair.getValue());
}

При этом список будет содержать все значения (включая и просто значения, и дубликаты) и почти эквивалентен результата простого вызова .values().

В следующем участке кода вы удаляете из мапы все значения, которые есть в списке

HashMap<String, String> copy = new HashMap<>(map);
Iterator<Map.Entry<String, String>> it2 = copy.entrySet().iterator();
while (it2.hasNext()) {
    Map.Entry<String, String> pair2 = it2.next();
    String smap = pair2.getValue();
    for (int i = 0; i < list.size(); i++) {
        String sarr = list.get(i);
        if (smap.equals(sarr)) {
            removeItemFromMapByValue(map, smap);
        }
    }
}

Так как в список уже загнаны вообще все значения, мапа очистится целиком.

Ваша настоящая задача - найти все дубликаты, сформировать из них коллекцию, после чего удалить каждый элемент из этой коллекции. Это делается довольно просто с помощью любой реализации Set, при желании можно осуществить вручную итерацией над списком.

READ ALSO
Обновление компонентов Swing

Обновление компонентов Swing

Имею класс, унаследованный от JFrame:

613
Объединение и сортировка в SQLite

Объединение и сортировка в SQLite

Есть запрос на получение данных с джойном многих таблицНеобходимо отсортировать товары по приоритету поле int Но не у каждого товара есть...

274
Java и USB передача данных - Java SE

Java и USB передача данных - Java SE

Нужно сделать приложениеЕго суть такова: Есть микроконтроллер (TTL) - он подключается через USB к ПК

372
Запутался в переопределениях методов java

Запутался в переопределениях методов java

Разрабатываю приложение на android - ключевая задача: работа с базой данных

428