Java: HashMapхранение того же значения, что и ключ и значение. - PullRequest
0 голосов
/ 08 сентября 2011

Я получаю этот странный вывод в HashMap.

У меня есть два ArrayList<String>, один из которых содержит ключ, а другой - значение.

Мой HashMap<String,String> будет хранить только строку какпара ключ-значение.Но сам ключ хранится в стоимости.Я проверил свой список значений, он печатает значение.Но во время установки он устанавливает его в качестве самого ключа.

Фрагмент кода:

public HashMap<String,String> getLstBarring()
    {
        ArrayList<String> temparrLst=setPreParameters(fetchPreDetails, 1);
        System.out.println("KEY"    +  temparrLst);

        ArrayList<String> tempArrLstId=setPreParameters(fetchPreDetails, 14);
        System.out.println("VALUE"      +tempArrLstId);
        int length=tempArrLstId.size();

        for(int index=0;index<length;index++)
        {
            System.out.println("VALUE IN KEY"   +  temparrLst.get(index));
            System.out.println("VALUE IN VALUE"   +   tempArrLstId.get(index));
            this.lstBarring.put(temparrLst.get(index), tempArrLstId.get(index));
        }
        System.out.println("INSIDE ODB....>>>>>>>>>>>>>>"   + lstBarring);

    return this.lstBarring;
    }

Проблема:

  • 1-й SOP - это KEY-печать всех ключейправильно.
  • 2-я СОП - VALUE, печатает все значения правильно.
  • 3-я СОП - VALUE IN KEY ---- печать всех значений.
  • 4-я СОП - VALUEIN VALUE - печать всех значений.

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

Вот посмотрите на мойМетод: -

public ArrayList<String> setPreParameters(HashMap<Integer,String> fetchPreDetails,int index)
    {   
        switch(index)
        {

        case 1:
        {
            arrLstData.clear();
            splittedString=fetchPreDetails.get(1).split(",");
            Collections.addAll(arrLstData, splittedString); 
            break;

        }

return arrLstData;

Пожалуйста, подскажите, где я ошибаюсь.

Ответы [ 3 ]

3 голосов
/ 08 сентября 2011

Я предполагаю, что либо fetchPreDetails является мутировавшей коллекцией setPreParameters(), либо setPreParameters() изменяет некоторые другие общие состояния, так что коллекция, на которую ссылается temparrLst, изменяется при втором вызове setPreParameters().Т.е.

List<String> strings = new ArrayList();
strings.add("a");
strings.add("b");
List<String> otherStrings = strings;
otherStrings.add("c");

Я предполагаю, что ваш код предполагает, что strings будет содержать "a" и "b", а otherStrings будет содержать "a", "b" и "c".Это не то, как ссылки на объекты работают в Java.Строка List<String> otherStrings = strings; заставляет strings и otherStrings указывать на одну и ту же коллекцию, и, следовательно, изменения, сделанные с использованием любого имени, влияют на одну и ту же вещь.

Редактировать: Ваша новая публикацияКод, кажется, подтверждает мою гипотезу.У вас есть переменная с именем arrLstData, которую вы очищаете, заполняете и возвращаете при каждом вызове setPreParameters().Вы возвращаете одну и ту же коллекцию каждый раз, когда вызываете этот метод.Поэтому у вас есть несколько дескрипторов одной коллекции вместо нескольких коллекций.Вам нужно создать новую коллекцию и возвращать ее каждый раз, когда вы звоните setPreParameters().

Редактируйте снова: Возможно, это прояснит ситуацию.Вот что вы делаете:

public static void main(String[] args) {
    Foo f = new Foo();
    List<String> list1 = f.getList("a", "b");
    System.out.println(list1);
    List<String> list2 = f.getList("c", "d");
    System.out.println(list2);
    System.out.println(list1);
}

static class Foo {
    private List<String> myList = new ArrayList<String>();
    public List<String> getList(String... strings) {
        myList.clear();
        myList.addAll(Arrays.asList(strings));
        return myList;
    }
}

Обратите внимание, что это именно то поведение, которое вы описываете, и правильный способ его решения выглядит примерно так:

public static void main(String[] args) {
    Foo f = new Foo();
    List<String> list1 = f.getList("a", "b");
    System.out.println(list1);
    List<String> list2 = f.getList("c", "d");
    System.out.println(list2);
    System.out.println(list1);
}

static class Foo {
    public List<String> getList(String... strings) {
        List<String> result = new ArrayList<String>();
        result.addAll(Arrays.asList(strings));
        return result;
    }
}
0 голосов
/ 08 сентября 2011

Возможно, вы имели в виду нечто подобное?

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class GlobalsMess {

    private Map<String, String> lstBarring = new HashMap<String, String>();
    private Map<Integer, String> fetchPreDetails = new HashMap<Integer, String>();

    public GlobalsMess() {
        fetchPreDetails.put(1, "john,vikam,david");
        fetchPreDetails.put(14, "1,2,3");
    }

    public Map<String, String> getLstBarring() {

        List<String> tempKeys = setPreParameters(fetchPreDetails.get(1));
        System.out.println("KEY" + tempKeys);

        List<String> tempIds = setPreParameters(fetchPreDetails.get(14));
        System.out.println("VALUE" + tempIds);

        for (int index = 0; index < tempIds.size(); index++) {
            System.out.println("VALUE IN KEY" + tempKeys.get(index));
            System.out.println("VALUE IN VALUE" + tempIds.get(index));
            this.lstBarring.put(tempKeys.get(index), tempIds.get(index));
        }
        System.out.println("INSIDE ODB....>>>>>>>>>>>>>>" + lstBarring);

        return this.lstBarring;
    }

    public List<String> setPreParameters(String fetchPreDetailsValue) {
        List<String> arrLstData = new ArrayList<String>();
        Collections.addAll(arrLstData, fetchPreDetailsValue.split(","));
        return arrLstData;
    }

    public static void main(String[] args) {
        new GlobalsMess().getLstBarring();
    }
}

Выход:

KEY[john, vikam, david]
VALUE[1, 2, 3]
VALUE IN KEYjohn
VALUE IN VALUE1
VALUE IN KEYvikam
VALUE IN VALUE2
VALUE IN KEYdavid
VALUE IN VALUE3
INSIDE ODB....>>>>>>>>>>>>>>{david=3, vikam=2, john=1}
0 голосов
/ 08 сентября 2011

Вы снова и снова используете один и тот же Список по вашему setPreParameters методу.
Список в arrLstData возвращается и сохраняется в temparrLst, теперь вы очищаете содержимое списков, помещаете новые вещи ви сохраняя его в tempArrLstId.
Теперь все три переменные содержат один и тот же список (они не равны, это одно и то же!).
В этом примере только один объект List!

Это похоже на то, что вы получили коробку и пометили ее с одной стороны, поместили в нее вещи, пометили "B" с другой стороны и удивились, почему коробка "B" пуста, когда вы переворачиваете коробку "A" вверх-вниз.

...