Есть ли какая-нибудь структура данных, в которой нет дубликатов, но в которую можно добавлять элементы при повторении? - PullRequest
0 голосов
/ 30 мая 2020

Я знаю, что в наборе нет дубликатов, но проблема в том, что я не могу добавлять в него элементы во время итерации с помощью итератора или для каждого l oop. Есть ли другой путь? Спасибо.

Ответы [ 2 ]

1 голос
/ 30 мая 2020

Для этого можно использовать класс ConcurrentHashMap. Например:

Set<T> set = Collections.newSetFromMap(new ConcurrentHashMap<T, Boolean>());

(Вы можете заменить <T, Boolean> на <> и позволить компилятору определять типы. Я написал это, как указано выше, для иллюстративных целей.)

Collections::newSetFromMap javado c говорит:

Возвращает набор, поддерживаемый указанной картой. Результирующий набор отображает те же характеристики упорядочения, параллелизма и производительности, что и резервная карта. По сути, этот фабричный метод обеспечивает реализацию Set, соответствующую любой реализации Map.

Поскольку ConcurrentHashMap допускает одновременную итерацию и обновления, то же самое делает Set, созданный, как указано выше. Загвоздка в том, что итерация может не видеть эффект добавлений или удалений, сделанных во время итерации.

Свойства параллелизма итерации могут быть выведены из javado c для ConcurrentHashMap.

Есть ли другой способ.

Это зависит от ваших требований, но есть потенциально способы избежать проблемы. Например, вы могли:

  1. скопировать набор перед его повторением, ИЛИ
  2. добавить новый элемент в другой новый набор и добавить существующие элементы в новый набор в новый набор после ... или пока ... итерация.

Однако они вряд ли будут работать без узких мест параллелизма (например, 1.) или различий в поведении (например, 2.)

0 голосов
/ 30 мая 2020

Не уверен, решит ли приведенный ниже подход вашу проблему, но вы можете попробовать:

    HashSet<Integer> original = new HashSet<>();
    HashSet<Integer> elementsToAdd = new HashSet<>();
    elementsToAdd.add(element); //while iterating original
    original.addAll(elementsToAdd); //Once done with iterating, just add all.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...