2013-12-20 2 views
5

У меня есть карта (Map<String, Set<String>>) и вы хотите скопировать карту в новый объект карты. Однако, если я просто прокормирую карту, скажем, HashMap конструктор (new HashMap<String, Set<String>>(oldMap)), он не будет делать полную копию и копирует только ссылку на набор, который может быть изменен, и эти изменения будут отражены на новой карте.Глубокое копирование карты Java со значениями, которые являются наборами

Есть ли более простой способ сделать полную копию, кроме итерации по каждой паре ключ/значение, и создать новый HashSet для каждого набора, а затем добавить это к карте?

+0

Я думаю, что это в основном дубликат [этого вопроса] (http://stackoverflow.com/questions/13049222/java-hashmap-deep-copy) глубокого копирования карты. На этот вопрос перечислено несколько ресурсов. – hinerm

+0

Итерация - единственный чистый и быстрый способ. Не следует принимать более трех строк кода. –

ответ

1

Было обсуждено на этом здесь для глубокого клонирования:

Java HashMap - deep copy

Это трудно в этой ситуации, хотя, как новая карта и установить необходимость перестраивать себя. Вам также нужно клонировать содержимое набора? Если это так, вы можете просто сериализовать, а затем де-сериализовать всю коллекцию.

Итерация себя почти наверняка будет быстрее и позволит вам контролировать, насколько глубока клонирование. Сериализация будет медленнее, но до тех пор, пока все дерево объектов сериализуется, оно копирует все в дереве объектов и поддерживает такие вещи, как циклические ссылки и т. Д. (Например, если у вас было 2 ключа на карте, указывающих на один и тот же объект Set, то итерация разделит это на 2 набора, сериализация сохранит ссылку).

+0

Не было бы смысла в клонировании строк. –

+0

Правда, но в какой-то момент в будущем может быть что-то другое, кроме строк. –

+0

Да, мне нужно клонировать содержимое набора. Google-библиотека кажется, что она может быть эффективной, но я стараюсь, чтобы проект был как можно более легким. Есть ли причина, по которой сериализация/десериализация будет лучшим подходом, а затем просто перебирать карту и создавать новый набор для каждой пары ключ/значение? – cole

0

Если вы не хотите использовать внешнюю библиотеку, и просто хотите, чтобы скопировать эту конкретную карту, которую вы можете сделать:

HashMap<String, HashSet<String>> copy = new HashMap<>(); 
for(String newKey : oldMap.keySet()){ 
    copy.put(newKey, new HashSet<String>(oldMap.get(newKey))); 
} 

Где oldMap является картой вы пытаетесь скопировать. Это сработало для меня.

Смежные вопросы