将键值组合为另一个映射的新值与java中的重复值

时间:2018-01-21 17:19:36

标签: java hashmap key multimap

我的self.handleEstimatedFrameForText(labelText).height + headerImageViewHeightmap1,我必须使用<k1,v1>创建map2作为map1之类的值。

但是密钥map2=<k3,map1>k1有重复,我们必须保留重复项。

实施例

k3

如何使用map1={(1,a),(1,b),(2,c)} map2={5={1,a},5={1,b},6={2,c}} hashmaps实现此目标(不使用番石榴的多图概念)

2 个答案:

答案 0 :(得分:0)

由于HashMap不允许存储重复的密钥,您可能需要考虑更改代码并创建HashMap<Key,ArrayList<HashMap>>。具有相同密钥的Map将存储在Key的{​​{1}}中的ArrayList下。 &{34; HashMap ArrayList&#34;将是 HashMap。有一个简单的例子,我看到你可以实现类似于包含更多值来复制键的东西(我使用硬编码的键值使其更容易阅读,我还在代码的注释中添加了一些解释):

HashMap

输出你得到:

import java.util.*;

public class A {
    public static void main(String[] args) {
        Map<Integer, ArrayList<Character>> map1 = new HashMap<>(); // Map containing few Characters under one key
        map1.put(1, new ArrayList<Character>()); 
        map1.get(1).add('a');
        map1.get(1).add('b');
        map1.put(2, new ArrayList<Character>());
        map1.get(2).add('c');
        System.out.println("map1: " + map1); // prints: map1: {1=[a, b], 2=[c]}
        Map<Integer, ArrayList<HashMap<Integer, Character>>> map2 = new HashMap<>(); // Map storing as keys 5 and 6, values are maps from map1
        map2.put(5, new ArrayList<HashMap<Integer, Character>>());
        map2.put(6, new ArrayList<HashMap<Integer, Character>>());
        for(Map.Entry<Integer, ArrayList<Character>> entry : map1.entrySet()) { // For each Integer-ArrayList pair from map1...
            if(entry.getKey().equals(1)) { // Check if key Integer is equal to 1, if it is...
                for(Character character : entry.getValue()) { // Create Maps containg pairs of Integer as key and each Character as value...
                    HashMap<Integer, Character> innerMap = new HashMap<>();
                    innerMap.put(entry.getKey(), character);
                    map2.get(5).add((new HashMap<Integer,Character>(innerMap)));
                }
            }
            if(entry.getKey().equals(2)) { // Check if key Integer is equal to 1, if it is...
                for(Character character : entry.getValue()) { // Create Maps containg pairs of Integer as key and each Character as value...
                    HashMap<Integer, Character> innerMap = new HashMap<>();
                    innerMap.put(entry.getKey(), character);
                    map2.get(6).add((new HashMap<Integer,Character>(innerMap)));
                }
            }

        }
        System.out.println("map2: " + map2); // prints: map2: {5=[{1=a}, {1=b}], 6=[{2=c}]}
    }
}

您可以使用结果地图以及map1: {1=[a, b], 2=[c]} map2: {5=[{1=a}, {1=b}], 6=[{2=c}]} getKey()方法的组合在移动中创建getValue()Map 5={1,a}请注意,您无法将它们存储在同一5=[{1=b})中。

答案 1 :(得分:0)

地图不允许任何给定键的多个映射。

但是,您可以做的是为Map<K1, List<V1>>设置map1,将键映射到值列表。

要添加条目而不是Map.put,请使用Map.computeIfAbsent

map1.computeIfAbsent(1, k -> new ArrayList<>()).add("a");
map1.computeIfAbsent(1, k -> new ArrayList<>()).add("b");
map1.computeIfAbsent(2, k -> new ArrayList<>()).add("c");

具有以下结构:

map1: {1=[a, b], 2=[c]}

现在,对于map2,目前尚不清楚您是否需要采用相同的方法或使用Map.put完成。