Уважаемые гуру, мастера и ученики,
обращаюсь к вам за помощью по задаче "Нам повторы не нужны".
В своей задаче написал достаточно "откормленный" код, который при тестовом прогоне в Intellij Idea исправно выполняет поставленное задание - удаляет дубликаты из созданной через createMap() карты все повторяющиеся имена.
Для проверки работы кода, в методе main() вызывал методы:
HashMap<String,String> test = createMap();
removeTheFirstNameDuplicates(test);
В самих методах добавлял строки System.out.println(имя_обрабатываемой_мапы_в_методе) для просмотра того. что остаётся в HashMap.
Так вот, если выполнить вывод в консоль Map на 64 строке, после foreach(), то в консоли вижу список имён без дублей.
Сидел над задачей весь вечер и всё утро, и не понимаю, где я неправ.
Буду рад совету или подсказке, в каком месте я ошибся.
Благодарю за внимание и время!
package com.javarush.task.task08.task0817;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
/*
Нам повторы не нужны
*/
public class Solution {
public static HashMap<String, String> createMap() {
//напишите тут ваш код
HashMap<String,String> hashMap = new HashMap<String,String>();
hashMap.put("Alfa","Vasily");
hashMap.put("Bravo","Grisha");
hashMap.put("Charlie","Tom");
hashMap.put("Echo","Vasily");
hashMap.put("Delta","Bill");
hashMap.put("Foxtrot","Willy");
hashMap.put("Gamma","Sam");
hashMap.put("Halo","Thor");
hashMap.put("Inter","Thor");
hashMap.put("Java","Michael");
return hashMap;
}
public static void removeTheFirstNameDuplicates(Map<String, String> map) {
//напишите тут ваш код
HashMap<String,String> hashMap = createMap();
Iterator<Map.Entry<String,String>> iter = hashMap.entrySet().iterator();
//создаю два массива строк в качестве буфера значений и ключей
ArrayList<String> bufVal = new ArrayList<String>();
ArrayList<String> bufKey = new ArrayList<String>();
//массив строк, в котором хранятся дубликаты имён
ArrayList<String> duplicates = new ArrayList<String>();
//заполняю буферы для пар ключ-значение
while (iter.hasNext()) {
Map.Entry<String,String> pair = iter.next();
bufVal.add(pair.getValue());
bufKey.add(pair.getKey());
}
//цикл-в-цикле для поэлементной проверки на уникальность
for (int i = 0; i < bufVal.size(); i++) {
String specimenA = bufVal.get(i);
for (int j = 0; j < bufVal.size(); j++) {
String specimenB = bufVal.get(j);
if (specimenB.equals(specimenA) && !(bufKey.get(i).equals(bufKey.get(j)))) {
//заносим дубликат имени в список дубликатов
duplicates.add(specimenB);
//эти строки испоьзовал для удаления из буфера дублей
//для уменьшения количества прогонов цикла,
//но закомментил их
//bufVal.remove(i);
//bufKey.remove(i);
}
}
}
//здесь запускаю требуемый метод для удаления дублей
for (String names : duplicates) {
removeItemFromMapByValue(hashMap,names);
}
}
public static void removeItemFromMapByValue(Map<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) {
}
}