Доброго времени суток! 🖐
Прошу вашей помощи в решении этой задачи, ибо я уже вроде бы всё довёл до конца, я вывожу на экран различные примеры и вижу что программа работает правильно.. но не проходит валидацию. Я очень много времени потратил на эту задачу.
Кратко изложу суть:
Изначально в этой задачи мы сталкиваемся с проблемой, что 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);
Я пока ошибок в работе программы не обнаружил, подскажите пожалуйста почему не проходит валидацию?package com.javarush.task.task08.task0817;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
/*
Нам повторы не нужны
*/
public class Solution {
public static Map<String, String> createMap() {
//напишите тут ваш код
Map<String, String> map = new ConcurrentHashMap<>();
map.put("Курицин","Александр"); // +
map.put("Борисов","Денис");
map.put("Зубов","Матвей");
map.put("Мартин","Чарльз"); // +
map.put("Фадеев","Александр"); // +
map.put("Герберт","Джордж"); // +
map.put("Оурэлл","Джордж"); // +
map.put("Диккенс","Чарльз"); // +
map.put("Твен","Марк");
map.put("Толстой","Лев");
return map;
}
public static void removeTheFirstNameDuplicates(Map<String, String> map) {
//напишите тут ваш код
ArrayList<String> nameList = new ArrayList<>(); // Создаем список для имён
// Заполняем имена
for (Map.Entry<String, String> pair : map.entrySet()){
String value = pair.getValue();
nameList.add(value);
}
// Удаление похожих имён из nameList
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 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;
}
}
public static void removeItemFromMapByValue(Map<String, String> map, String value) {
Map<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 main(String[] args) {
}
}