Значения параметров Java из карты в набор

Я пытаюсь создать метод, который берет первую карту, значения которой являются наборами, и вторую пустую карту, значениями которой являются списки, и заполняет вторую карту теми же сопоставлениями ключа/значения, что и первая. 2-я карта будет иметь каждый ключ из 1-й карты, но с ней связан список всех тех же элементов, которые находятся в наборе, с которым она сопоставляется. Используйте ArrayList на второй карте. Вот такой метод у меня получился.

public static<K,E> void values(Map<K, Set<E>> ml, Map<K, List<E>> m2){
  for (Map.Entry<K, Set<E>> e; e < ml.size(); ? // I am not sure what to write here: a e.hasNext() or a e.next)
  // then i have to use a put method right?
  m2.put(e.getKey(), new ArrayList<E>(? )) // I don't know how to get the value, would it just be the same as e.getKey() or e.value
}

Можете ли вы сказать мне, как бы вы это сделали? или если что-то не так? спасибо за помощь


person Community    schedule 13.10.2009    source источник


Ответы (4)


Не на 100% именно то, что вы имеете в виду, но как насчет этого:

public static<K,E> void values(Map<K, Set<E>> m1, Map<K, List<E>> m2)
{
    for(K key : m1.keySet())
    {
        Set<E> source = m1.get(key);

        List<E> dest = m2.get(key);
        if(dest == null)
        {
            dest = new ArrayList<E>();
            m2.put(key, dest);
        }

        dest.addAll(source);
    } 
}
person Outlaw Programmer    schedule 13.10.2009
comment
Спасибо за ответ, а что такое ресивер? - person ; 14.10.2009
comment
Ой, я переименовал «получатель» в «назначение», но, похоже, я пропустил эту строку. - person Outlaw Programmer; 14.10.2009

2 варианта:

public static <K, E> void values(Map<K, Set<E>> m1, final Map<K, List<E>> m2) {
    if (m1 == null)
        throw new IllegalArgumentException("null map 1");
    if (m2 == null)
        throw new IllegalArgumentException("null map 2");

    for (Map.Entry<K, Set<E>> e : m1.entrySet()) {
        m2.put(e.getKey(), new ArrayList<E>(e.getValue()));
    }
}

public static <K, E> Map<K, List<E>> values(Map<K, Set<E>> m) {
    if (m == null)
        throw new IllegalArgumentException("null map");

    Map<K, List<E>> m2 = new HashMap<K, List<E>>(Math.max(
            (int) (m.size() / 0.75f) + 1, 16), 0.75f);

    for (Map.Entry<K, Set<E>> e : m.entrySet()) {
        m2.put(e.getKey(), new ArrayList<E>(e.getValue()));
    }

    return m2;
}
person bruno conde    schedule 13.10.2009
comment
Выглядит хорошо, но я думаю, что явное указание начальной емкости немного излишне и может сбивать с толку. - person Outlaw Programmer; 14.10.2009

Я считаю, что циклы while лучше подходят для итерации, чем для циклов, но, возможно, это только я :)

public static<K,E> void values(Map<K, Set<E>> m1, Map<K, List<E>> m2) {
    Iterator<K> iter = m1.keySet().iterator();
    while (iter.hasNext()) {
        K key = iter.next();
        Set<E> value = m1.get(key);
        m2.put(key, new ArrayList<E>(value));
    }
}
person Spyder    schedule 13.10.2009
comment
Большое спасибо! Итак, keySet просто поместит значения из m1 в итератор, верно? - person ; 14.10.2009
comment
Да. Keyset дает вам набор всех ключей m1 :) В качестве альтернативы вы можете использовать набор записей, который позволяет избежать вызова get() для каждого ключа. - person Spyder; 14.10.2009