作者:天之道 | 来源:互联网 | 2023-01-30 08:35
假设我有一个带字符串键和整数值的HashMap:
map = {cat=1, kid=3, girl=3, adult=2, human=5, dog=2, boy=2}
我想通过将此信息放入另一个HashMap来切换键和值.我知道HashMap不能有重复的键,因此我尝试将信息放入带有Integer的HashMap中,用于映射到String ArrayList的键,这样我就可以将一个Integer映射到多个字符串:
swap = {1=[cat], 2=[adult, dog, boy], 3=[kid, girl], 5=[human]}
我尝试了以下代码:
HashMap> swap = new HashMap>();
for (String x : map.keySet()) {
for (int i = 0; i <= 5; i++) {
ArrayList list = new ArrayList();
if (i == map.get(x)) {
list.add(x);
swap.put(i, list);
}
}
}
我的代码唯一的区别是我没有将数字5硬编码到我的索引中; 我有一个方法,在原始的HashMap中找到最高的整数值并使用它.我知道它工作正常,因为我得到相同的输出,即使我在那里硬编码5,我只是没有包括它来节省空间.
我的目标是能够使用任何数据集进行"反转",否则我只能对值进行硬编码.我从上面的代码得到的输出是这样的:
swap = {1=[cat], 2=[boy], 3=[girl], 5=[human]}
正如您所看到的,我的问题是值ArrayList只保留放入其中的最后一个String,而不是收集所有String.如何使ArrayList存储每个String,而不仅仅是最后一个String?
1> Jacob G...:
使用Java 8,您可以执行以下操作:
Map map = new HashMap<>();
map.put("cat", 1);
map.put("kid", 3);
map.put("girl", 3);
map.put("adult", 2);
map.put("human", 5);
map.put("dog", 2);
map.put("boy", 2);
Map> newMap = map.keySet()
.stream()
.collect(Collectors.groupingBy(map::get));
System.out.println(newMap);
输出将是:
{1=[cat], 2=[adult, dog, boy], 3=[kid, girl], 5=[human]}
在`Map`键中使用`EntrySet`而不是键&#39;Set` - 并且将值一起存储在`Entry`中 - 你不应该每次都在调用`get`的键上循环; 这是没有意义的.使用下游`mapping``Collection`从条目中提取值.
2> Zeromus..:
你正在为每次迭代重新创建arrayList,我无法找到一种方法来使用该逻辑,这是一个很好的方法,但不需要检查最大整数:
for (Map.Entry entry : map.entrySet()) {
String key = entry.getKey();
Integer value = entry.getValue();
List get = swap.get(value);
if (get == null) {
get = new ArrayList<>();
swap.put(value, get);
}
get.add(key);
}