2016-03-02 61 views
0

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

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

拥有一套哪些线路在'add'应该是在做什么?您是否试图将键/值对添加到您的多值图中? – khelwood

+0

@khelwood如果使用多值映射表示包含多个映射的映射,那么是的。例如,有效的命令可以在之后添加(4,5)和添加(7,8)。然后,该映射应该包含从整数4到包含整数5的集合的映射,以及从整数7到包含整数8的集合的映射。 – Ken

+0

好吧,但是如果您执行'add(4,5)'和然后'添加(4,6)',那么你期望什么? – khelwood

回答

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添加到集合中。

3

只需添加一个新的Set,如果没有已经在Mapa的映射,然后(在地图是否刚添加,或以前)添加值在MapSet

connection.computeIfAbsent(a, k -> new HashSet<Integer>()).add(b); 
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包含键映射。如果它不,它会在那里HashSet是一个空

connection.get(key)将返回关联到HashMap中的键添加一个映射条目{key, HashSet}

.add(val)现在的价值添加到

这保证如果键犯规存在一个HashSet被创建,然后将其添加值由关键

+0

您正在使用的情况下,3个查找存在用于在地图,这比需要更多的酮(或2,如果使用新的Java 8点的方法)的值没有映射。您应该获取该值并检查它是否为空,并保留对新创建的Set的引用。 – fabian

+0

感谢您的回答。我无法遵循你的代码。请问“connection.get(key).add(val);”命令添加整数3到地图,或HashSet包含整数3? – Ken

+0

@Ken Ill在答案中写下解释。但'connection.get(key)'将返回'HashSet'。然后'.add(val)'将值添加到集合中 –

相关问题