我的地图应包含从整数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);
}
答案 0 :(得分:3)
如果Set
中还没有a
的映射,那么只需添加新的Map
,然后将值添加到Set
中Map
(无论是刚添加还是之前添加到地图中):
connection.computeIfAbsent(a, k -> new HashSet<Integer>()).add(b);
答案 1 :(得分:3)
假设您致电add(4,5)
然后add(4,6)
如果结果是您的地图现在包含4 -> {5,6}
(即,关键4
链接到包含5
和6
的集合,那么您所做的是多值地图。
添加到多值地图中的方法是这样的:
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>
这可以保证在密钥不存在时创建哈希集,然后将值添加到密钥所拥有的集合中