2016-03-02 115 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)'將值添加到集合中 –

相關問題