Как перебрать MultiKeyMap?

Я использую MultiKeyMap из commons-collection, которые предоставляют пары multikey-value. У меня есть 3 ключа, которые являются строки. У меня есть две проблемы, которые я не вижу, как решить.

Как я могу перебрать все пары multikey-value? С простым HashMap я это знаю.

Во-вторых, как я могу получить все пары multikey-value с фиксированными первыми двумя ключами? Это означает, что я хотел бы получить что-то вроде этого multiKey.get("key1","key2",?); Где третий ключ не указан.

1 ответ

Итерация по значению ключа для MultiKeyMap аналогична хэш-карте:

    MultiKeyMap<String, String> multiKeyMap = new MultiKeyMap();

    multiKeyMap.put( "a1", "b1", "c1", "value1");
    multiKeyMap.put( "a2", "b2", "c2", "value1");

    for(Map.Entry<MultiKey<? extends String>, String> entry: multiKeyMap.entrySet()){
        System.out.println(entry.getKey().getKey(0)
                +" "+entry.getKey().getKey(1)
                +" "+entry.getKey().getKey(2)
                + " value: "+entry.getValue());
    }

Для вашего второго запроса вы можете написать свой собственный метод, основанный на предыдущей итерации.

public static Set<Map.Entry<MultiKey<? extends String>, String>> match2Keys(String first, String second,
                                                                                MultiKeyMap<String, String> multiKeyMap) {
        Set<Map.Entry<MultiKey<? extends String>, String>> set = new HashSet<>();
        for (Map.Entry<MultiKey<? extends String>, String> entry : multiKeyMap.entrySet()) {
            if (first.equals(entry.getKey().getKey(0)) 
                && second.equals(entry.getKey().getKey(1))) {
                set.add(entry);
            }
        }
        return set;
    }

Я использую commons-collections 4.4 версия, которая предоставляет forEachметод. Его можно использовать следующим образом.

MultiKeyMap<String,Integer> multiKeyMap=new MultiKeyMap<>();
        multiKeyMap.put("class 9","Div A",30);
        multiKeyMap.put("class 9","Div B",40);
        multiKeyMap.forEach((key,value)->{
            System.out.println(key.getKey(0)+" & "+key.getKey(1)+" -> "+value);
        });

Output:
class 9 & Div A -> 30
class 9 & Div B -> 40

Вы можете перебирать список в values ​​():

    for(Object entry: multiKey.values()){ //TODO }

Я только что понял, что это вопрос четырехлетней давности...

Другие вопросы по тегам