给定一个整数数组,比如,
integers[] = {1, 2, 1, 7, 2};
我计划使用以下代码返回一个 Map,其中数组元素作为键,该元素的索引作为值。
例如,在这种情况下,我们将返回:
1 -> (0,2)
2 -> (1,4)
7 -> (3)
但它并不完全有效 - 添加到集合中的初始值没有出现。这是代码:
Map<Integer, Set<Integer>> hm = new HashMap<>();
for ( int k=0; k<integers.length; k++) {
Integer key=integers[k];
if (hm.containsKey(key))
hm.get(key).add(k);
else
hm.put(key, new HashSet<Integer>(k));
}
您的代码将不起作用,因为以下代码:
hm.put(key, new HashSet(k));
不做你想的那样。该构造函数不接受初始元素,它接受初始大小。
请改为执行以下操作:
Map<Integer, Set<Integer>> hm = new HashMap<>();
for (int k=0; k<integers.length; k++){
Integer key=integers[k];
if (!hm.containsKey(key))
hm.put(key, new HashSet<>());
hm.get(key).add(k);
}
正如@Bohemian正确所说,您没有正确使用HashSet的构造函数。
关于你发布的问题,另一种解决方案是使用Guava的HashMultimap类:
int integers[] = {1, 2, 1, 7, 2};
Multimap hm = HashMultimap.create();
for (int k = 0; k < integers.length; k++) {
Integer key = integers[k];
hm.put(key, k);
}
Map<Integer, Collection<Integer>> result = hm.asMap();