22

我需要键集中的链接和多个键。我试过这个:

LinkedHashMap<Integer, String> map = new LinkedHashMap< Integer,String>();

map.put( -1505711364,"4");
map.put(294357273, "15"); map.put(-1593134417, "28"); map.put(-1231165758, "45");
map.put(121046798, "58");
map.put(294357273, "71"); map.put(-1593134417, "82"); map.put(-1231165758, "95");
map.put(121046798, "108");

我需要保留顺序的重复键。这样做的方法是什么?

4

4 回答 4

36

您不能在Map. 您可以创建一个Map<Key, List<Value>>,或者如果可以,使用Guava 的Multimap.

Multimap<Integer, String> multimap = ArrayListMultimap.create();
multimap.put(1, "rohit");
multimap.put(1, "jain");

System.out.println(multimap.get(1));  // Prints - [rohit, jain]

然后你可以得到java.util.Map使用Multimap#asMap()方法。

于 2013-09-20T17:06:00.137 回答
20

使用Map<Integer, List<String>>

Map<Integer, List<String>> map = new LinkedHashMap< Integer, List<String>>();

map.put(-1505711364, new ArrayList<>(Arrays.asList("4")));
map.put(294357273, new ArrayList<>(Arrays.asList("15", "71")));
//...

要在此映射中添加新的键/值对:

public void add(Integer key, String newValue) {
    List<String> currentValue = map.get(key);
    if (currentValue == null) {
        currentValue = new ArrayList<String>();
        map.put(key, currentValue);
    }
    currentValue.add(newValue);
}
于 2013-09-20T17:05:11.650 回答
13

Map不支持重复键。您可以将集合用作针对同一键的值。

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

文档

您可以根据您的要求使用任何类型 List或实现。Set

如果您的值也可能重复,您可以使用ArrayListor LinkedList,如果值是唯一的,您可以使用HashSetorTreeSet等​​。


另外在google guava 集合库 Multimap中可用,它是一个将键映射到值的集合,类似于 Map,但其中每个键可能与多个值相关联。您可以将 multimap 的内容可视化为从键到非空值集合的映射:

a → 1, 2
b → 3  

例子 -

ListMultimap<String, String> multimap = ArrayListMultimap.create();
multimap.put("a", "1");
multimap.put("a", "2");
multimap.put("c", "3");
于 2013-09-20T17:06:11.410 回答
1

hashMaps不能有重复的键。也就是说,您可以使用列表值创建地图:

Map<Integer, List<String>>

但是,使用这种方法会对性能产生影响。

于 2013-09-20T17:08:25.513 回答