Java 从循环中的映射中删除值
我试图比较两个映射,并从一个映射中删除包含在第二个映射中的值。代码如下:Java 从循环中的映射中删除值,java,hashmap,Java,Hashmap,我试图比较两个映射,并从一个映射中删除包含在第二个映射中的值。代码如下: HashMap<String, String> firstMap = new HashMap<>(); HashMap<String, String> secondMap = new HashMap<>(); firstMap.put("keyOne", "valueOne"); firstMap.put("keyTwo", "valueTw
HashMap<String, String> firstMap = new HashMap<>();
HashMap<String, String> secondMap = new HashMap<>();
firstMap.put("keyOne", "valueOne");
firstMap.put("keyTwo", "valueTwo");
firstMap.put("THIS KEY WILL BE REMOVED", "valueThree");
System.out.println("\nMAP ONE\n" + firstMap + "\n");
secondMap.put("keyOne", "valueOne");
secondMap.put("keyTwo", "valueTwo");
System.out.println("\nMAP TWO\n" + secondMap + "\n");
Iterator<String> firstMapIterator = firstMap.keySet().iterator();
if(!firstMap.equals(secondMap)){
firstMapIterator.next();
for(String key : firstMap.keySet()){
if(firstMap.containsKey(key) && !secondMap.containsKey(key)){
firstMapIterator.remove();
break;
}
}
}
System.out.println("\nMAP ONE MATCHING MAP TWO?\n" + firstMap + "\n");
有什么想法吗?谢谢
编辑:此代码的目标是:
-比较两张地图
-通过每个键递增
-如果在secondMap中找不到密钥,请从firstMap中删除该密钥,因为您没有正确使用迭代器。您只需将迭代器前进一次(
firstMapIterator.next()
),因此迭代器获得的第一个键将是从映射中删除的键,而不管for(String key:firstMap.keySet())
循环中当前的键是什么
对于
循环,您不需要:
Iterator<String> firstMapIterator = firstMap.keySet().iterator();
while (firstMapIterator.hasNext()) {
if(!secondMap.containsKey(firstMapIterator.next())) {
firstMapIterator.remove();
break;
}
}
Iterator firstMapIterator=firstMap.keySet().Iterator();
while(firstMapIterator.hasNext()){
如果(!secondMap.containsKey(firstMapIterator.next()){
firstMapIterator.remove();
打破
}
}
您只需一行即可完成此操作:
HashMap<String, String> firstMap = new HashMap<>();
HashMap<String, String> secondMap = new HashMap<>();
firstMap.put("keyOne", "valueOne");
firstMap.put("keyTwo", "valueTwo");
firstMap.put("THIS KEY WILL BE REMOVED", "valueThree");
System.out.println("\nMAP ONE\n" + firstMap + "\n");
secondMap.put("keyOne", "valueOne");
secondMap.put("keyTwo", "valueTwo");
System.out.println("\nMAP TWO\n" + secondMap + "\n");
// Remove everything from firstMap that is in secondMap.
firstMap.keySet().removeAll(secondMap.keySet());
System.out.println("\nMAP ONE MATCHING MAP TWO?\n" + firstMap + "\n");
HashMap firstMap=newhashmap();
HashMap secondMap=新的HashMap();
firstMap.put(“keyOne”、“valueOne”);
firstMap.put(“keyTwo”、“valueTwo”);
firstMap.put(“此键将被删除”,“值三”);
System.out.println(“\n映射一\n”+firstMap+”\n”);
第二个地图。放置(“keyOne”、“valueOne”);
secondMap.put(“键二”,“值二”);
System.out.println(“\n映射两个\n”+secondMap+”\n”);
//从firstMap中删除secondMap中的所有内容。
firstMap.keySet().removeAll(secondMap.keySet());
System.out.println(“\n映射一个匹配的映射二?\n”+firstMap+“\n”);
请参阅JavaDoc以了解:
返回此映射中包含的键的集合视图。集合由映射支持,因此对映射的更改将反映在集合中,反之亦然。。。集合支持元素移除,即通过迭代器.remove、set.remove、removeAll、retainal和clear操作从映射中移除相应的映射
你不需要在地图上迭代
你可以简单地做
firstMap.keySet().removeAll(secondMap.keySet());
这将从第一个贴图中删除第二个贴图中存在的所有关键点
此外,您还可以使用以下方法删除第一个贴图中不是第二个贴图中的的所有关键点:
firstMap.keySet().retainAll(secondMap.keySet());
检查您的firstMapIterator.next()代码>添加到for循环
HashMap<String, String> firstMap = new HashMap<String, String>();
HashMap<String, String> secondMap = new HashMap<String, String>();
firstMap.put("keyOne", "valueOne");
firstMap.put("keyTwo", "valueTwo");
firstMap.put("THIS KEY WILL BE REMOVED", "valueThree");
System.out.println("\nMAP ONE\n" + firstMap + "\n");
secondMap.put("keyOne", "valueOne");
secondMap.put("keyTwo", "valueTwo");
System.out.println("\nMAP TWO\n" + secondMap + "\n");
Iterator<String> firstMapIterator = firstMap.keySet().iterator();
if(!firstMap.equals(secondMap)){
for(String key : firstMap.keySet()){
firstMapIterator.next();//add here in for loop
if(firstMap.containsKey(key) && !secondMap.containsKey(key)){
firstMapIterator.remove();
break;
}
}
}
System.out.println("\nMAP ONE MATCHING MAP TWO?\n" + firstMap + "\n");
HashMap firstMap=newhashmap();
HashMap secondMap=新的HashMap();
firstMap.put(“keyOne”、“valueOne”);
firstMap.put(“keyTwo”、“valueTwo”);
firstMap.put(“此键将被删除”,“值三”);
System.out.println(“\n映射一\n”+firstMap+”\n”);
第二个地图。放置(“keyOne”、“valueOne”);
secondMap.put(“键二”,“值二”);
System.out.println(“\n映射两个\n”+secondMap+”\n”);
迭代器firstMapIterator=firstMap.keySet().Iterator();
如果(!firstMap.equals(secondMap)){
for(字符串键:firstMap.keySet()){
firstMapIterator.next();//将此处添加到for循环中
if(firstMap.containsKey(键)和&!secondMap.containsKey(键)){
firstMapIterator.remove();
打破
}
}
}
System.out.println(“\n映射一个匹配的映射二?\n”+firstMap+“\n”);
正如其他人所说,您可以在一行中完成:
firstMap.keySet().removeAll(secondMap.keySet());
另一种方法是使用以下方法:
上述内容可改写如下:
firstMap.keySet().removeIf(secondMap::containsKey);
因此,我将firstMapIterator.next()
移动到for循环中,现在它似乎工作正常。谢谢-啊,刚才看到的编辑将阅读again@ribenalight123正如我所说,您不需要for循环。使用显式迭代器和增强的for循环是毫无意义的。谢谢您的帮助。您的代码示例非常好,谢谢您是否需要中断代码>?如果有两个条目需要删除怎么办?另外,您真的需要if
检查吗?equals
以类似于您随后迭代的方式在地图中进行迭代,因此这是重复的工作。认为您被打败了;)这是一个很好的例子,谢谢你们,但并没有达到我想要的,很抱歉在原来的帖子中不够清晰。我正在删除地图中不存在的所有元素。并非所有元素都是present@ribenalight123然后,您可以使用retainal
而不是removeAll
。请编辑您的问题,以澄清您希望从一个映射中删除第二个映射中不包含的值。
firstMap.keySet().removeIf(k -> secondMap.containsKey(k));
firstMap.keySet().removeIf(secondMap::containsKey);