Делал проверку с выводом: в результате неё "Laiti Eeriks" из-за "Liejtiniu Eeriks" оказывается удаленным, остальные на месте. То есть, всё как надо... но, судя по валидатору, не надо.
Для разъяснения смотрите коментарии сбоку кода.
package com.javarush.task.task08.task0817;
import java.util.*;
/*
Нам повторы не нужны
*/
public class Solution {
public static HashMap<String, String> createMap() {
HashMap<String, String> map = new HashMap<String, String>();
map.put("Kaskiu", "Algas");
map.put("Liejtiniu", "Eeriks");
map.put("Jusu", "Raimas");
map.put("Kapiu", "Ristas");
map.put("Tikaniu", "Sakaras");
map.put("Lainie", "Armas");
map.put("Laiti", "Eeriks");
map.put("Laksu", "Nikas");
map.put("Mielasnijema", "Eskas");
map.put("Sala", "Dzzoels");
return map;
}
public static void removeTheFirstNameDuplicates(Map<String, String> map) {
HashMap<String, String> copy = new HashMap<String, String>(map); //Для избежания ConcurrentModificationException
Iterator<Map.Entry<String, String>> iterator = copy.entrySet().iterator(); //Итерируется копия оригинала
while(iterator.hasNext()){
Map.Entry<String, String> pair = iterator.next();
removeItemFromMapByValue(map, pair.getValue()); //Берем имя для проверки из копии. Сверяем и удаляем уже на оригинале
}
}
public static void removeItemFromMapByValue(Map<String, String> map, String value) {
HashMap<String, String> copy = new HashMap<String, String>(map); //То же самое, ConcurrentModificationException
boolean e = false; //Было ли первое сходство
for (Map.Entry<String, String> pair : copy.entrySet()) { //Сверяем по копии
if (pair.getValue().equals(value)) //Если имеет место сходство
if(e) //... и если сходство уже второе
map.remove(pair.getKey()); //... проделываем удаление из оригинала второго сходства по тому же ключу
else
e = true; //... иначе, если сходство первое, игнорируем его и заносим этот факт
}
}
public static void main(String[] args) {
HashMap<String, String> map = new HashMap<String, String>();
map = createMap();
removeTheFirstNameDuplicates(map);
}
}