Java设置从映射到集合的值

Java设置从映射到集合的值,java,map,arraylist,set,Java,Map,Arraylist,Set,我正在尝试创建一个方法,该方法获取值为set的第一个映射和值为list的第二个空映射,并使用与第一个映射相同的键/值映射填充第二个映射。第二个映射将具有第一个映射中的每个键,但与之相关联的是它映射到的集合中的所有相同元素的列表。使用第二个映射中的ArrayList。这是我得到的方法 public static<K,E> void values(Map<K, Set<E>> ml, Map<K, List<E>> m2){ for (

我正在尝试创建一个方法,该方法获取值为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
}
publicstaticvoid值(Map ml,Map m2){
for(Map.Entry e;e
你能告诉我你会怎么做吗?或者有什么不对劲吗?
感谢您的帮助

我发现while循环比循环更适合迭代,但可能只有我:)

公共静态空隙值(图m1、图m2){
迭代器iter=m1.keySet().Iterator();
while(iter.hasNext()){
K key=iter.next();
设置值=m1.get(键);
m2.put(键,新数组列表(值));
}
}

不是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);
    } 
}
公共静态空隙值(图m1、图m2)
{
对于(K键:m1.keySet())
{
设置source=m1.get(键);
List dest=m2.get(键);
如果(dest==null)
{
dest=newarraylist();
m2.放置(键,目标);
}
目的地加全部(来源);
} 
}
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;
}
公共静态空隙值(地图m1、最终地图m2){
如果(m1==null)
抛出新的IllegalArgumentException(“空映射1”);
如果(m2==null)
抛出新的IllegalArgumentException(“空映射2”);
对于(Map.Entry e:m1.entrySet()){
m2.put(e.getKey(),newarraylist(e.getValue());
}
}
公共静态映射值(映射m){
如果(m==null)
抛出新的IllegalArgumentException(“空映射”);
Map m2=新的HashMap(Math.max(
(内部)(m.尺寸()/0.75f)+1,16),0.75f);
对于(Map.Entry e:m.entrySet()){
m2.put(e.getKey(),newarraylist(e.getValue());
}
返回m2;
}

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

  • SetMultimap
    相当于
    Map
  • ListMultimap
    相当于
    Map
接口将大量数组/列表的复杂性抽象出来,所需的方法如下所示:

public static <K, E> void values(Multimap<K, E> m1, Multimap<K, E> m2) {
    m2.putAll(m1);
}
公共静态无效值(多贴图m1、多贴图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 =)
Multimap map1=HashMultimap.create();
map1.放置(“a”、“第一”);
map1.put(“a”,“second”);
map1.put(“b”、“第三”);
map1.get(“a”);/>返回[“第一”、“第二”]
map1.get(“b”);/>返回[“第三”]
map1.get(“c”);/>返回[],空集=)

非常感谢您!所以,键集只会将m1中的值放入迭代器,对吗?是的。Keyset为您提供了一组所有m1键:)或者您可以使用entry set,它可以避免为每个键调用get()。谢谢您的回答,但什么是receiver?哎呀,我将“receiver”重命名为“dest”,但看起来好像我错过了这一行。看起来不错,但我认为显式设置初始容量有点过火,可能会让人困惑。
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 =)