每次调用方法时创建一个新集

时间:2016-03-02 15:21:30

标签: java

我的地图应包含从整数a到整数b的关系。整数b应该在一个集合中。可以使用add方法添加从整数a到整数b的关系。要创建这样的关系,我必须在每次调用add方法时创建一个新的Set(以包含b)。我该怎么做?我想我知道如何用数组做这个,因为它们支持包含变量的名称,但是set不支持。

public class intRelImplementation extends intRel {

    protected final Map<Integer, Set<Integer>> connection;

    public intRelImplementation (final int n) {
        super(n);
        connection = new HashMap<>();
    }

    @Override
    public void add(int a, int b) {
    // I have to create a new Set everytime the Add method is called. 
    // The Set should contain the Integer b, and this set should then be 
    // placed into the Map: Map<a, Set<b>>.
        Set<Integer> setInMap = new HashSet<>(); //not correct obviously
        Set setInMap2 = new HashSet(setInMap);
    }

3 个答案:

答案 0 :(得分:3)

如果Set中还没有a的映射,那么只需添加新的Map,然后将值添加到SetMap(无论是刚添加还是之前添加到地图中):

connection.computeIfAbsent(a, k -> new HashSet<Integer>()).add(b);

答案 1 :(得分:3)

假设您致电add(4,5)然后add(4,6) 如果结果是您的地图现在包含4 -> {5,6}(即,关键4链接到包含56的集合,那么您所做的是多值地图。

添加到多值地图中的方法是这样的:

public void add(int a, int b) {
    Set<Integer> values = connection.get(a);
    if (values==null) {
        values = new HashSet<Integer>();
        connection.put(a, values);
    }
    values.add(b);
}

即,获取与密钥a关联的集合 如果没有,请创建一个并将其添加到地图中 将您的值b添加到集合中。

答案 2 :(得分:2)

我认为这就是你正在寻找的东西

public class intRelImplementation extends intRel {

    protected final Map<Integer, Set<Integer>> connection;

    public intRelImplementation (final int n) {
        super(n);
        connection = new HashMap<>();
    }

    @Override
    public void add(int key, int val) {
        if(!connection.containsKey(key)){
            connection.put(key, new HashSet<>());    
        }            
        connection.get(key).add(val);
    }
    ...
}

!connection.containsKey(key)将检查HashMap是否包含键映射。如果没有,它将为{key, HashSet}添加一个映射条目,其中HashSet为空HashSet<Integer>

connection.get(key)将返回与HashMap中的密钥关联的HashSet<Integer>

.add(val)现在会将值添加到HashSet<Integer>

这可以保证在密钥不存在时创建哈希集,然后将值添加到密钥所拥有的集合中