重复值 - 地图

时间:2013-07-05 07:54:56

标签: java

我有两个地图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 个答案:

答案 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);

我想你需要在existstrue后摆脱循环。

您可以使用更简单的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() ) );