Java设置值从Map到Set

时间:2009-10-13 23:26:12

标签: java map arraylist set

我正在尝试创建一个方法,该方法将第一个Map的值设置为第二个,而第二个空Map的值为Lists,并使用与第一个相同的键/值映射填充第二个Map。第二个映射将包含第一个映射中的每个键,但与之关联的是它映射到的Set中所有相同元素的List。在第二个映射中使用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
}

你能告诉我你会怎么做吗?或者如果有什么不对的? 谢谢你的帮助

4 个答案:

答案 0 :(得分:1)

不是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);
    } 
}

答案 1 :(得分:1)

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;
}

答案 2 :(得分:0)

我发现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));
    }
}

答案 3 :(得分:0)

如果可以,我强烈建议您使用MultiMap。 Google有一个很棒的界面Multimap。有两个子接口:

  • SetMultimap<K, V>,相当于Map<K, Set<V>>
  • ListMultimap<K, V>,相当于Map<K, List<V>>

接口抽象出很多数组/列表的复杂性,所需的方法如下:

public static <K, E> void values(Multimap<K, E> m1, Multimap<K, E> m2) {
    m2.putAll(m1);
}

(不用说,首先你不需要额外的方法)。

界面允许简单的插入模式

Multimap<String, String> map1 = HashMultimap.create();
map1.put("a", "first");
map1.put("a", "second");
map1.put("b", "third");

map1.get("a");  // --> returns ["first", "second"]
map1.get("b");  // --> returns ["third"]
map1.get("c");  // --> returns [], empty set =)