0

我有一个清单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);
    }
}

但这也行不通。

我在这里做错了什么?

4

8 回答 8

2

根据Map put(K,V) 方法文档

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

您每次都在这里覆盖密钥。

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

每次更改密钥并尝试喜欢

for(String s:gotitems){
     map.put(s,s);
}
于 2013-07-04T07:37:28.703 回答
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);
    }   
}
于 2013-07-04T07:53:21.767 回答
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没有唯一值,将其值作为键移动到 aMap将覆盖一些Map的值。在这种情况下,您希望首先确保您List有唯一的键,或者可能使用 aMap<Integer, String>的索引作为 的ListMap,并将实际List值作为 的值Map

于 2013-07-04T07:39:02.683 回答
0

当你写

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

您将丢弃地图中针对“a”键持有的任何现有条目。因此,在您的迭代之后,您的地图将只包含一个对应于gotitems.

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

至于您的第二种方法,如果您可以更清楚地定义“它不起作用”会有所帮助:也许遍历地图并打印键和值。

于 2013-07-04T07:39:17.657 回答
0

请注意,在地图中,一个键最多可以指向一个值。在您的情况下,您正在执行以下映射:
“a”->“one”然后将其覆盖为
“a”->“two”,然后将其覆盖为
“a”->“three”

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

于 2013-07-04T07:39:57.503 回答
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 次放入 map 中,尽管您只希望将 n ( gotitems.size()) 个项目放入 map 中。

首先决定要在地图中使用的键,复制ListMap一种方法可以使用索引作为key

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

输出应该是:

KEY-0 第一

KEY-1 秒

KEY-2 第三

于 2013-07-04T07:41:46.307 回答
0

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

map.put("a");

您需要根据唯一键存储每个元素,因此添加如下内容:

int count = 0;
for(String s:gotitems){
     map.put("a" + count,s);
     count++;
}
于 2013-07-04T07:37:07.493 回答
0

您正在尝试将三个字符串放在同一键下的地图中"a"。尝试为您的值使用唯一键。

于 2013-07-04T07:38:18.403 回答