хранить одну и ту же ссылку на объект с разными значениями на карте

#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.