覆盖位于ArrayList <String>中的HashMap中的值

jtr*_*n17 15 java arraylist hashmap

假设我有一个带字符串键和整数值的HashMap:

map = {cat=1, kid=3, girl=3, adult=2, human=5, dog=2, boy=2}
Run Code Online (Sandbox Code Playgroud)

我想通过将此信息放入另一个HashMap来切换键和值.我知道HashMap不能有重复的键,因此我尝试将信息放入带有Integer的HashMap中,用于映射到String ArrayList的键,这样我就可以将一个Integer映射到多个字符串:

swap = {1=[cat], 2=[adult, dog, boy], 3=[kid, girl], 5=[human]}
Run Code Online (Sandbox Code Playgroud)

我尝试了以下代码:

HashMap<Integer, ArrayList<String>> swap = new HashMap<Integer, ArrayList<String>>();

for (String x : map.keySet()) {
        for (int i = 0; i <= 5; i++) {
            ArrayList<String> list = new ArrayList<String>();
            if (i == map.get(x)) {
                list.add(x);
                swap.put(i, list);
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

我的代码唯一的区别是我没有将数字5硬编码到我的索引中; 我有一个方法,在原始的HashMap中找到最高的整数值并使用它.我知道它工作正常,因为我得到相同的输出,即使我在那里硬编码5,我只是没有包括它来节省空间.

我的目标是能够使用任何数据集进行"反转",否则我只能对值进行硬编码.我从上面的代码得到的输出是这样的:

swap = {1=[cat], 2=[boy], 3=[girl], 5=[human]}
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,我的问题是值ArrayList只保留放入其中的最后一个String,而不是收集所有String.如何使ArrayList存储每个String,而不仅仅是最后一个String?

Jac*_* G. 23

使用Java 8,您可以执行以下操作:

Map<String, Integer> 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<Integer, List<String>> newMap = map.keySet()
                                       .stream()
                                       .collect(Collectors.groupingBy(map::get));

System.out.println(newMap);
Run Code Online (Sandbox Code Playgroud)

输出将是:

{1=[cat], 2=[adult, dog, boy], 3=[kid, girl], 5=[human]}

  • 在`Map`键中使用`EntrySet`而不是键'Set` - 并且将值一起存储在`Entry`中 - 你不应该每次都在调用`get`的键上循环; 这是没有意义的.使用下游`mapping``Collection`从条目中提取值. (2认同)

Zer*_*mus 6

你正在为每次迭代重新创建arrayList,我无法找到一种方法来使用该逻辑,这是一个很好的方法,但不需要检查最大整数:

for (Map.Entry<String, Integer> entry : map.entrySet()) {
    String key = entry.getKey();
    Integer value = entry.getValue();
    List<String> get = swap.get(value);
    if (get == null) {
        get = new ArrayList<>();
        swap.put(value, get);
    }
    get.add(key);
}
Run Code Online (Sandbox Code Playgroud)