如何从列表中将多个值放在Map中

时间:2013-07-04 07:34:29

标签: java collections

我有一个列表gotitems

ArrayList<String> gotitems = new ArrayList<String>();

我需要将该列表放在名为map的散列图中。

Map<String,String> map = new HashMap<String,String>();

我试过这个:

for(String s:gotitems){
     map.put("a",s);
}

gotitems包含:

First
Second
Third

但输出:

System.out.println(map.values());

给出:

Third
Third
Third
我甚至试过这个:

for(String s:gotitems){
    for(int j=0;j<gotitems.size();j++){
          map.put("a"+j,s);
    }
}

但这也行不通。

我在这里做错了什么?

8 个答案:

答案 0 :(得分:2)

根据Map put(K,V) method docs

  

将指定的值与此映射中的指定键相关联(可选操作)。如果映射先前包含键的映射,则旧值将替换为指定的值。

每次在这里,你都会忘记密钥。

 for(String s:gotitems){
         map.put("a",s);
    }

每次更改密钥并尝试

for(String s:gotitems){
     map.put(s,s);
}

答案 1 :(得分:0)

这是因为您将地图中的所有项目放在相同的键“a”

map.put("a");

您需要针对唯一键存储每个元素,因此请添加以下内容:

int count = 0;
for(String s:gotitems){
     map.put("a" + count,s);
     count++;
}

答案 2 :(得分:0)

您正尝试在同一个键"a"下的地图中放置三个字符串。尝试使用唯一键来表示您的价值观。

答案 3 :(得分:0)

您将所有商品都放在Map中并使用相同的键:“a”。 每个值都应该有一个唯一的String键。

例如:

List<String> list = new ArrayList<String>();
list.add("one");
list.add("two");
list.add("three");
Map<String, String> map = new LinkedHashMap<String, String>();
for (String s: list) {
    map.put(s, s);
}
System.out.println(map);

输出:

{one=one, two=two, three=three}

请注意LinkedHashMap:它维护您放置键/值对的顺序。

修改当然,如果您的List没有唯一值,则将其值作为Map的键移动将覆盖部分Map值。在这种情况下,您希望首先确保List具有唯一键,或者使用Map<Integer, String>的{​​{1}}值作为List的键,Map,以及实际List值作为Map的值。

答案 4 :(得分:0)

写作时

for(String s:gotitems){
     map.put("a",s);
}

您将根据键“a”删除地图中的任何现有条目。因此,在迭代之后,您的地图将只包含一个与gotitems中最后一个迭代值对应的条目。

要有效地使用地图,您需要考虑您的密钥是什么。然后使用map.put(myKeyForThisItem, s)代替。如果您没有有效的密钥方案,那么使用地图是没有意义的,因为人们倾向于使用密钥来提取相应的值。

至于你的第二种方法,如果你能够更清楚地定义“它不工作”会更有帮助:可能会遍历地图并打印键和值。

答案 5 :(得分:0)

请注意,在地图中,键最多可以指向一个值。在您的情况下,您正在执行以下映射:
“a” - &gt; “一” 然后你把它覆盖为
“a” - &gt; “二” 然后你把它覆盖为
“a” - &gt; “三”

记住:一个键最多可以指向一个值。但是,可以通过多个键指向一个值。

答案 6 :(得分:0)

这是错误的:

for(String s:gotitems){
     map.put("a",s);
}

由于您对所有值使用"a"公共密钥,因此将保留最后插入的键值对,并覆盖所有先前的键值。

这也不正确:

for(String s:gotitems){
    for(int j=0;j<gotitems.size();j++){
          map.put("a"+j,s);
    }
}

你要在地图上放n * n次,尽管你只想要n(gotitems.size())个项目进入地图。

首先确定要在地图中使用的密钥,将List复制到Map一种方法可以使用索引key

for(int j=0;j<gotitems.size();j++){
              map.put("KEY-"+j,gotitems.get(j));
        }

输出应为:

  

KEY-0首先

     

KEY-1 Second

     

KEY-2第三

答案 7 :(得分:0)

我已经重现了你的代码。问题是您将相同的键分配给不同的值。这应该有用。

import java.util.*;

public class testCollection{
    public static void main(String[] args){
        ArrayList<String> gotitems = new ArrayList<String>();
        gotitems.add("First");
        gotitems.add("Second");
        gotitems.add("Third");

        Map<String,String> map = new HashMap<String,String>();

        String x = "a";
        int i = 1;

        for(String s:gotitems){         
            map.put(x+i,s);
            i++;
        }

        System.out.println(map);
    }   
}