Доброго времени суток! 🖐 Прошу вашей помощи в решении этой задачи, ибо я уже вроде бы всё довёл до конца, я вывожу на экран различные примеры и вижу что программа работает правильно.. но не проходит валидацию. Я очень много времени потратил на эту задачу. Кратко изложу суть: Изначально в этой задачи мы сталкиваемся с проблемой, что HashMap не позволяет себя редактировать во время работы через for each , я нашёл решение и пошёл через ConcurrentHashMap, что развязало мне руки и я могу спокойно пользоваться методом removeItemFromMapByValue. С этой задачей справился.. дальше пора строить логику программы.. Испробовав множество различных решений не прибегая к создания Arraylist с именами(как советуют в других темах), я всё же пошёл на это и начал вырисовывать логику на бумаге. Я занёс все имена из Map в Arraylist
for (Map.Entry<String, String> pair : map.entrySet()){
            String value = pair.getValue();
            nameList.add(value);
        }
Дальше я принял решение сделать "белый список" в Arraylist, то есть список имён "без повторений", на который потом буду равняться.
int status = 0;
        for (Map.Entry<String, String> pair : map.entrySet()) {
            String name = pair.getValue();
            for (int j = 0; j < nameList.size(); j++) {
                if (nameList.get(j).equals(name)) status++;
                if (status >= 2) {
                    for (int k = 0; k < nameList.size(); k++) {
                        if (nameList.get(k).equals(name)) nameList.remove(k);
                    }
                }
            }
            status = 0;
        }
Я задал для имён маркер статуса int status = 0; Взял свою Map и взял от туда имя: String name = pair.getValue(); Дальше я решил проходится по ArrayList и чистить его от повторений. Почему в этом коде три for? Дело в том что когда мы первый раз встречаем повторяющиеся имена в цикле.. мы ещё не знаем что его нужно удалять, у нас просто совпало искомое имя с тем что уже есть в базе, а нам нужно более одного повторения, и когда мы дальше по циклу пойдём и увидим что у нас ещё раз повторилось имя, мы программно сможем удалить только это имя, а то которое мы встречали ранее - останется, потому что мы не прописали логику как к нему вернуться. Поэтому, если мы дважды в коде встречаем наше имя
if (status >= 2)
Тогда я ЗАНОВО иду по ArrayList и уже программа понимает что у этого имени status = 2, и все имена с этим статусом надо удалить. После выхода из тела цикла для следующего имени я обнуляю статус status = 0; Я надеюсь что мне удалось объяснить, потому что как мне кажется этот кусок кода работает без проблем. Дальше, имея белый список имён, я начинаю работать с Map.
int statusName = 0;
 for (Map.Entry<String, String> pair : map.entrySet()){
     String value = pair.getValue();
     for (int i = 0; i < nameList.size(); i++) {
         if (value.equals(nameList.get(i))) statusName++;
     }
     if (statusName == 0) removeItemFromMapByValue(map, value);
     statusName = 0;
 }
Тут тоже есть маркер statusName = 0;, потому что я столкнулся с проблем, что мне нужно идти ОТ ОБРАТНОГО, то есть я не знаю какие имена мне надо удалять, в моём белом списке в ArrayList там имена которые нужно ОСТАВИТЬ. Поэтому я этим маркером буду помечать те имена, которые следует оставлять.
if (value.equals(nameList.get(i))) statusName++;
Таким образом я реализовываю for для своей Map, внутри ставлю for для ArrayList, беру первое имя String value = pair.getValue(); из Map и сравниваю его с именами в ArrayList. Если это имя не совпадает с именами из Белого списка(ArrayList), это имя Маркер Не получает, и соответственно подлежит удалению
if (statusName == 0) removeItemFromMapByValue(map, value);
Я пока ошибок в работе программы не обнаружил, подскажите пожалуйста почему не проходит валидацию?