我有两个地图Map和Map2,其中值继续添加。 我需要通过比较Map中的所有值来检查是否在Map2中添加了重复值。我写了一个简单的函数,但它总是给出错误的。 < ---这是我的问题,如果存在重复,它应该是真的。
Map<String, String> map = new HashMap<String, String>();
map.put("1", "Jan");
map.put("2", "Feb");
map.put("3", "Mar");
map.put("4", "Apr");
map.put("5", "May");
map.put("6", "Jun");
List<String> ids = new ArrayList<String>();
Iterator iterator = map.entrySet().iterator();
while (iterator.hasNext()) {
Map.Entry mapEntry = (Map.Entry) iterator.next();
System.out.println("The key is: " + mapEntry.getKey()
+ ",value is :" + mapEntry.getValue());
String value = (String) mapEntry.getValue();
ids.add(value);
//ids.addAll(mapEntry.getValue());
}
Map<String, String> map1 = new HashMap<String, String>();
map1.put("112", "Jan1");
map1.put("22", "Feb");
map1.put("31", "Ma2r");
map1.put("43", "Apr3");
map1.put("51", "May4");
map1.put("63", "Jun5");
Iterator iterator1 = map1.entrySet().iterator();
boolean exists = false;
String value1 = null;
while (iterator1.hasNext()) {
Map.Entry mapEntry = (Map.Entry) iterator1.next();
System.out.println("The key is: " + mapEntry.getKey()
+ ",value is :" + mapEntry.getValue());
value1 = (String) mapEntry.getValue();
//ids.addAll(mapEntry.getValue());
}
for(String id: ids){
System.out.println("ids: " + id);
exists = ids.contains(value1);
}
System.out.println("Value exist?" + exists);
答案 0 :(得分:9)
你的生活变得复杂......
Map
has a .containsValue()
方法;)
现在,您应该更准确地了解您的真实问题。你真的在谈论值或者你是指地图条目吗?
如果是值,请使用.containsValue()
。如果是完整条目,则只需:
// Supposes values CAN NOT BE NULL
map2.containsKey(theKey) && map2.get(theKey).equals(theValue)
另一种解决方案,虽然稍微复杂一点,但如果您的地图非常大,这有助于将地图修改包装在一个方法中,除了将它们存储在地图中之外,您还可以在HashSet
中记录值;然后,您可以检查值集.contains()
是否要添加值。
答案 1 :(得分:3)
只回答你的具体问题,而不是纠正你的整个逻辑。我想说,因为变量exists
在循环内部,你在循环后打印它,变量值被覆盖。
for(String id: ids){
System.out.println("ids: " + id);
exists = ids.contains(value1); // exists is assigned a new value each time here
}
System.out.println("Value exist?" + exists);
我想你需要在exists
为true
后摆脱循环。
您可以使用更简单的API方法,例如containsValue()。
答案 2 :(得分:1)
如果您只需要查找地图中是否存在此特定值,则可以在找到后退出循环。
这样,你的变量在你中断后仍然会被设置为true,如果你没有突破你的循环,它将是假的。
for(String id: ids){
System.out.println("ids: " + id);
exists = ids.contains(value1);
if(exists) {
break;
}
}
System.out.println("Value exist?" + exists);
答案 3 :(得分:0)
为什么不使用:
int mapSize = map.values().size();
ArrayList<String> mapValues = new ArrayList<String>( map.values() );
mapValues.removeAll( map1.values() );
System.out.println( "Value exists? " + ( mapSize != mapValues.size() ) );