Java:HashMap <string,string>存储与键和值相同的值。?</string,string>

时间:2011-09-08 15:03:24

标签: java generics arraylist hashmap key-value

我在HashMap中收到了这个奇怪的输出。

我有两个ArrayList<String>一个包含密钥,另一个包含值。

我的HashMap<String,String>只会将字符串存储为键和值对。但关键本身就是存储在价值中。我检查了我的值arraylist,它打印了值。但是在把它设置为关键时它就是关键。

代码段是:

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;
    }

问题是:

  • 第一个SOP正确打印所有键。
  • 第二个SOP是VALUE-正确打印所有值。
  • 第三个SOP是VALUE IN KEY ----打印所有值。
  • 第四个SOP值为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 个答案:

答案 0 :(得分:3)

我的猜测是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;行使stringsotherStrings指向同一个集合,因此使用任一名称所做的更改都会影响相同的内容。

编辑:您新发布的代码似乎证明了我的假设。您有一个名为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;
    }
}

答案 1 :(得分:0)

您正在setPreParameters方法一遍又一遍地重复使用相同的列表 arrLstData中的列表会被返回并存储在temparrLst中,现在您要清除列表内容,在其中添加新内容并将其存储到tempArrLstId。 现在这三个变量都包含相同的列表(它们不等于,它们是相同的!) 整个示例中只有一个List对象!

就像你有一个盒子并标记它“A”在一侧放入其中的东西,在另一侧标记为“B”并且想知道为什么盒子“B”在你转动盒子“A”时是空的 - 下来。

答案 2 :(得分:0)

你可能意味着这样的事情吗?

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}