-2

我有两个地图 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);
4

4 回答 4

9

你把你的生活复杂化了……

Map有一个.containsValue()方法;)

现在,您应该更准确地了解您的真正问题。你实际上是在谈论一个还是你的意思是一个地图条目

如果是一个值,只需使用.containsValue(). 如果是完整条目,则很简单:

// Supposes values CAN NOT BE NULL
map2.containsKey(theKey) && map2.get(theKey).equals(theValue)

另一个解决方案,虽然有点复杂,但如果你的地图真的很大,这会有所帮助,是将地图修改包装在一个方法中HashSet,除了将它们存储在地图中之外,你还可以在其中记录值;然后,您可以检查该值是否设置.contains()了您要添加的值。

于 2013-07-05T08:00:04.373 回答
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我想一旦你的is ,你需要打破循环true

您可以使用更简单的 API 方法,例如containsValue()

于 2013-07-05T07:57:37.333 回答
1

如果您只需要查找此特定值是否存在于您的地图中,您可以在找到它之后跳出您的循环。

这样,您的变量在您中断后仍将设置为 true,如果您没有跳出循环,它将为 false。

for(String id: ids){
  System.out.println("ids: " + id);
  exists = ids.contains(value1);
  if(exists) {
      break;
  }
}

System.out.println("Value exist?" + exists);
于 2013-07-05T07:59:30.093 回答
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() ) );
于 2013-07-05T08:06:01.210 回答