#java #collections
#java #Коллекции
Вопрос:
У меня есть требование вставить одну и ту же ссылку на объект с разными значениями, как показано ниже:
Test.java:
class Test {
private List<String> elements = new ArrayList<String>();
//add some elements and get
public void add(String s) {
this.elements.add(s);
}
public void clear() {
this.elements.clear();
}
}
Map<String, Test> map = new HashMap<String, test>();
Test one = new Test();
one.add("firstelement"); //adds to element list
map.put("first", one);
//clear and add some more elements
one.clear();
one.add("secondelement");
//Add some more elements without creating
map.put("second", one);
Теперь, при извлечении, когда мы вставляем ту же тестовую ссылку в MAP, мы имеем следующий вывод
Есть ли какой-либо способ повторно использовать существующий тестовый объект с другим списком элементов на КАРТЕ??
map.get("first") //retrieving list with element "Second Element"
map.get("second") //retrieving list with element "Second Element"
В любом случае для достижения этой
Комментарии:
1. Это не кажется логичным, потому что вы боретесь с языком. Когда вы
clear
устанавливаете первую ссылку за пределами карты, вы также очищаете ту, что находится внутри карты. Все внесенные вами изменения отражаются в обоих местах, поэтому создание нового списка кажется единственным логичным способом.
Ответ №1:
Это не совсем ясно в вопросе, но я предполагаю, что вы хотите это сделать:
map.get("first") //retrieving list with element "firstelement"
map.get("second") //retrieving list with element "secondelement"
Чтобы сделать это, вы должны создать другой Test
объект. Вы должны заменить строку
one.clear();
с
one = new Test();
Комментарии:
1. Я должен повторно использовать существующий объект, а не создавать новый объект каждый раз, когда мне это нужно.
2. Тогда я не думаю, что есть какой-либо способ, которым вы можете это сделать, за исключением метода, показанного в другом ответе, который требует, чтобы вы изменили тип карты. @RamuPasupuleti
3. Вы не можете повторно использовать его и ожидать, что он будет содержать значения, которые были очищены.
4. @RamuPasupuleti слишком плохо. Невозможно выполнить оба из них одновременно.
Ответ №2:
Возможно, вы захотите, чтобы ваш Map
определялся как :
Map<String, String> map = new HashMap<String, String>();
И измените то, что вы добавляете в
one.add("firstelement");
map.put("first", one.get(0));
Для этого потребуется get
метод в Test
:
public String get(int index) {
this.elements.get(index);
}
Редактировать
Если вы хотите Map
сохранить ссылки на Test
объекты, используйте ответ Sweeper.
Если вы хотите Map
сохранить в List
объекты, вы можете сделать копию этого списка перед повторным Test
использованием: добавьте этот метод в Test
:
private List<String> getList() {
return this.elements;
}
и измените способ добавления в :
Map<String, List> map = new HashMap<String, List>();
Test one = new Test();
one.add("firstelement"); //adds to element list
//store a refrence to a copy of elements in map
map.put("first", new ArrayList<String>(one.getList()));
Комментарии:
1. Но если они очищаются
one
, как в их примере, не имеет большого значения, индексируете ли вы его. Значения исчезнут, нет?2.
Map<String, String>
хранит не ссылкуone
, а строковое значениеone(index)
3. Ах, я вижу, что ты задумал. Я полагаю, это настолько хорошо, насколько они могут получить за то, что они хотят, предполагая, что они не ожидают списка значений.
4. Я не совсем понимаю, чего пытается достичь OP. Я добавил возможность сохранения значений списка массива перед воссозданием
one
.5. Я предполагаю, что это проблема X-Y, поскольку описание, похоже, «противоречит» поведению Java.