使用 HashMap<Integer, Set<Integer>> 对数字进行分类,但集合缺少第一个值



给定一个整数数组,比如,

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();

最新更新