-2

値が追加され続ける 2 つのマップ Map と Map2 があります。Map のすべての値を比較して、重複する値が Map2 に追加されているかどうかを確認する必要があります。単純な関数を作成しましたが、常に false になります。<--- これは私の質問です。重複が存在する場合は、true になるはずです。

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ますtrue

containsValue()のような単純な API メソッドを使用できます。

于 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 に答える