Объясните, пожалуйста, какой смысл данного метода

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());
    }*/
}

, если он в итоге генерит исключение ConcurrentModificationException?

задан 09 Янв, 13:06

Jh_Mnemonic's gravatar image

Jh_Mnemonic
214
одобрено: 25%


Все с ним нормально, другое дело ВАШ код, из которого вы вызываете этот метод, вот он генерит ConcurrentModificationException.

Как-то это бревно в глазу напоминает...)

ссылка

опубликован 09 Янв, 13:09

Haart's gravatar image

Haart
4.7k110
одобрено: 47%

@Jh_Mnemonic, "Никак ваш ответ не помог." А какой вы хотели ответ, если не показали весь код, который эту ошибку вызывает? Какой вопрос, такой и ответ.

(09 Янв, 14:09) AlexeyY

Я и не придираюсь, просто указываю на небольшую ошибку. А вот то что указано - ВАШ код, это как нормальное указание куда копать.

Погуглите что значит ConcurrentModificationException, просмотрите код еще раз, что-бы понять где и почему вылетает исключение. Там все довольно просто.

(09 Янв, 13:37) Haart

Ну зачем же придираться к словам? Пусть будет мой код генерит при вызове данного метода. Никак ваш ответ не помог. И не мой код генерит, если уже быть до конца придирчивым, а компилятор.

(09 Янв, 13:31) Jh_Mnemonic

Спасибо разобрался просто нашел, что есть способ удаления элементов коллекции с помощью итератора и с помощью неявной итерации, применяя копию коллекции. Небольшая, но существенная подсказка(она помогла мне до конца разобраться) - оригинал модифицируется, а копия используется для прохода по всей коллекции. А два цикла для прохода по всем значениям коллекции и для перебора по каждому значению в отдельности.

ссылка

опубликован 11 Янв, 11:15

Jh_Mnemonic's gravatar image

Jh_Mnemonic
214
одобрено: 25%

Хорошо вот код

import java.util.HashMap; import java.util.Iterator; import java.util.Map;

public class Solution { public static HashMap<string, string=""> createMap() { HashMap<string, string=""> map = new HashMap<string, string="">();

    map.put("Stallone", "Silv");
    map.put("Shwarc", "Arni");
    map.put("Geer", "Rich");
    map.put("Jhonson", "Mike");
    map.put("Atckison", "Rouny");
    map.put("Svensen", "Tom");
    map.put("Braun", "Fill");
    map.put("Tyson", "Mike");
    map.put("Bloundy", "Fill");
    map.put("Lastname1", "Firstname1");

    return map;
}

public static void removeTheFirstNameDuplicates(HashMap<String, String> map)
{
    //напишите тут ваш код
    HashMap<String, String> mapCopy = new HashMap<String, String>(map);
    int counter = 0;

    for (Iterator<Map.Entry<String, String>> itr = map.entrySet().iterator(); itr.hasNext(); )
    {
        Map.Entry<String, String> entry = itr.next(); // ошибка в этой строке /* at com.javarush.test.level08.lesson08.task05.Solution.removeTheFirstNameDuplicates(Solution.java:46)*/
// один внешний  цикл отрабатывает и все (((
        for (Iterator<Map.Entry<String, String>> itrCopy = mapCopy.entrySet().iterator(); itrCopy.hasNext(); )
        {
            Map.Entry<String, String> entryCopy = entry;
            if (entry.getValue().equals(entryCopy.getValue()))
                counter++;
            if (counter != 0)
            {
                removeItemFromMapByValue(map, entry.getValue()); // 
                break;
            }
        }
    }

}

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) throws Exception
{
    HashMap<String, String> map = createMap();
    removeTheFirstNameDuplicates(map);
}

}

Понимаю, что в 28 строке полная лажа я просто сравниваю первые элементы map и mapCopy, но не знаю, как сравнить первый элемент со следующим. А на счет исключения я все отлично понимаю модификация и удаление производится через Iterator, а не как не через foreach, поэтому и задал изначально вышеуказанный вопрос.

ссылка

опубликован 09 Янв, 15:19

Jh_Mnemonic's gravatar image

Jh_Mnemonic
214
одобрено: 25%

изменено 09 Янв, 15:40

Если это новый объект, имеет смысл, но если изменения только в старом...

Все простые типы - byte, short ... ... double передаются по значению. Массив - это тоже объект.

(12 Янв, 06:49) Haart

Т.е. по вашим словам обьект не имеет смысла возвращать в метод вызоваобратно, он и так изменится? И согласно вашему ответу примитивы передаются по значению? Трудно привыкнуть к новому мышлению - я раньше си изучал.

(12 Янв, 03:07) Jh_Mnemonic

Если это объект, передается ссылка на объект, и соответственно в объекте происходят изменения.

(11 Янв, 12:14) Haart

Остается не понятным только один вопрос: Метод удаляющий одинаковые фамилии не возвращает в метод вызова модифицированную коллекцию, но при этом в методе-дупликате оригинальный Map изменяется. Почему так? Ведь общеизвестно, что в джаве в метод передаются параметры по значению, а не по ссылке. По идее должен быть возврат измененного объекта назад с последующим присвоением или я не прав?

(11 Янв, 11:31) Jh_Mnemonic

Теперь, зная, конечно, все становится просто. Раньше я так не считал. Спасибо Haartу за хладнокровие и терпение. Эмоции тут лишние. Но и сарказм ни к чему. Все мы нубы только каждый на своем уровне, кто-то выше кто-то ниже. Просветленных мало, я бы даже сказал их нет.

(11 Янв, 11:21) Jh_Mnemonic

removeItemFromMapByValue показывает неплохой пример как надо действовать, создаете копию, переменную для счета, два цикла. И го считать, если строка встречается более одного раза...

(09 Янв, 16:00) Haart
Ваш ответ
включить просмотр

Следить за вопросом

По Email:

После авторизации вы сможете подписаться на любые обновления здесь

Основы Markdown

  • *italic* or _italic_
  • **bold** or __bold__
  • ссылка:[текст](http://url.com/ "заголовок")
  • изображение?![alt текст](/path/img.jpg "заголовок")
  • нумерованный список: 1. Foo 2. Bar
  • Для того чтобы добавить разрыв строки просто добавьте два пробела.
  • основные HTML тэги, также поддерживаются

Тэги:

×7

Задан: 09 Янв, 13:06

Просмотров: 95 раз

Отредактирован: 12 Янв, 06:49