Java 将两个不同大小的列表合并到一个地图

Java 将两个不同大小的列表合并到一个地图,java,Java,我正在尝试将两个列表合并到一个地图中。 两个列表大小不相等 Map<String, String> finalMap = new HashMap<String, String>(); List<String> names = new ArrayList<String>(); 位置列表仅包含值西班牙、法国。 我正在尝试创建一个这样的地图 finalMap.put("seloger", "spain" ); finalMap.put("franc

我正在尝试将两个列表合并到一个地图中。 两个列表大小不相等

Map<String, String> finalMap = new HashMap<String, String>();
  List<String> names = new ArrayList<String>();
位置
列表仅包含值
西班牙、法国
。 我正在尝试创建一个这样的地图

finalMap.put("seloger", "spain" );
finalMap.put("france24", "france" );
finalMap.put("sports", null );
finalMap.put("tupple", null );
finalMap.put("hentry", null);
这是我使用的代码

Iterator<String> names = names .iterator();
        Iterator<String> locations= location .iterator();
        for (names .hasNext();;) {
            String tag = locations.next();
            tag = null != tag ? tag : null;
            finalMap .put(names .next(), tag);
        }
Iterator name=names.Iterator();
迭代器位置=location.Iterator();
对于(names.hasNext();;){
String tag=locations.next();
tag=null!=tag?tag:null;
finalMap.put(names.next(),tag);
}

这里我无法插入到
finalMap
,因为我得到了
NoTouchElementException
。如何在
null
中插入位置值。下一步();不包含任何值

尝试这样插入

finalMap.put("sports", "");

您应该检查迭代器是否有下一个元素

if (locations.hasNext()) {
    tag = locations.next();
} else {
    tag = null;
}

由于
映射
的每个条目都必须有一个键而不是一个值,因此您不妨迭代直到
名称
完成,然后停止,因为没有键的其他值无法存储:

for(int i=0;i
如果名称或位置中的任何一个可以是短的:

    Map<String, String> finalMap = new HashMap<String, String>();

    List<String> name = new ArrayList<String>();
    List<String> location = new ArrayList<String>();

    // ....

    Iterator<String> names = name.iterator();
    Iterator<String> locations= location.iterator();

    while (names.hasNext() && locations.hasNext()) {
        finalMap.put(names.next(), locations.next());
    }
    while (names.hasNext()) {
        finalMap.put(names.next(), null);
    }
    while (locations.hasNext()) {
        finalMap.put(null, locations.next());
    }
Map finalMap=newhashmap();
列表名称=新的ArrayList();
列表位置=新的ArrayList();
// ....
迭代器名称=name.Iterator();
迭代器位置=location.Iterator();
while(names.hasNext()&&locations.hasNext()){
finalMap.put(name.next(),locations.next());
}
while(names.hasNext()){
finalMap.put(names.next(),null);
}
while(locations.hasNext()){
finalMap.put(null,locations.next());
}
公共静态void main(字符串[]args){
列表名称=array.asList(“seloger”、“france24”、“sports”、“tupple”、“hentry”);
列表位置=Arrays.asList(“西班牙”、“法国”);
Map Map=newhashmap();
迭代器i=location.Iterator();
for(字符串名称:名称){
字符串值=i.hasNext()?i.next():null;
map.put(名称、值);
}
系统输出打印项次(map);
}
理想情况下,您可以使用zip或zipWith来组合这两个列表。不幸的是,JDK 8似乎没有这样的功能,所以您必须编写命令式代码

我运行了上面的代码。它会给你想要的结果

    Map<String, String> finalMap = new HashMap<String, String>();

    List<String> name = new ArrayList<String>();
    List<String> location = new ArrayList<String>();

    // ....

    Iterator<String> names = name.iterator();
    Iterator<String> locations= location.iterator();

    while (names.hasNext() && locations.hasNext()) {
        finalMap.put(names.next(), locations.next());
    }
    while (names.hasNext()) {
        finalMap.put(names.next(), null);
    }
    while (locations.hasNext()) {
        finalMap.put(null, locations.next());
    }
public static void main(String[] args) {
    List<String> names = Arrays.asList("seloger", "france24", "sports", "tupple", "hentry");
    List<String> location = Arrays.asList("spain", "france");

    Map<String, String> map = new HashMap<String, String>();
    Iterator<String> i = location.iterator();
    for (String name : names) {
        String value = i.hasNext() ? i.next() : null;
        map.put(name, value);
    }

    System.out.println(map);
}