Хотите получить общий ключ, и это несколько значений в двух хэш-картах

#java

#java

Вопрос:

Я инициализировал две хэш-карты, как показано ниже

 Map<String,List<String>> propertiesMapList1=new HashMap<String,List<String>>();
Map<String,List<String>> propertiesMapList2=new HashMap<String,List<String>>();
  

и добавление в него ключа с несколькими значениями.

 propertiesMapList1.put(srvFld, values);
propertiesMapList2.put(srvFld, values);
  

Я могу получить общие ключи в двух хэш-картах, как мне получить соответствующие значения?

 Set<String> keysInA = new HashSet<String>(propertiesMapList1.keySet());
Set<String> keysInB = new HashSet<String>(propertiesMapList2.keySet());

// Keys in A and not in B
Set<String> inANotB = new HashSet<String>(keysInA);
inANotB.removeAll(keysInB);

// Keys common to both maps
Set<String> commonKeys = new HashSet<String>(keysInA);
commonKeys.retainAll(keysInB);

Iterator itr = commonKeys.iterator();
while(itr.hasNext()){
    System.out.println("common key ::"  itr.next());
}
  

Комментарии:

1. Вы пытаетесь создать две карты, содержащие только общие ключи и значения?

Ответ №1:

Вы можете использовать Set.retainAll после создания нового Set на основе одного из наборов ключей, а затем получить каждый ключ для обеих карт.

 Map<String,List<String>> map0 =new HashMap<String,List<String>>();
Map<String,List<String>> map1 =new HashMap<String,List<String>>();
map0.put("Foo", Arrays.asList(new String[]{"a", "b", "c"}));
map0.put("Blah", Arrays.asList(new String[]{"d", "e", "f"}));
map1.put("Baz", Arrays.asList(new String[]{"3", "4", "5"}));
map1.put("Blah", Arrays.asList(new String[]{"g", "h", "i"}));

Set<String> retained = new HashSet<String>(map0.keySet());
retained.retainAll(map1.keySet());
for (String k: retained) {
    System.out.printf("In map0: %s%n", map0.get(k));
    System.out.printf("In map1: %s%n", map1.get(k));
}
  

Вывод

 In map0: [d, e, f]
In map1: [g, h, i]
  

Комментарии:

1. OP уже использовался retainAll . Хотя я по-прежнему немного не уверен, был ли это его фактический вопрос, учитывая простоту шага, который он пропустил.

2. @OliverMatthews да, это довольно неоднозначно, теперь, когда вы указали на это. Будет ждать реакции OP и при необходимости удалит мой ответ. Спасибо.

Ответ №2:

Конечно, это просто:

 Iterator<String> itr = commonKeys.iterator();
while(itr.hasNext()){
    String key = itr.next();
    System.out.println("common key ::"   key);
    System.out.println("list1 value ::"   propertiesMapList1.get(key));
    System.out.println("list2 value ::"   propertiesMapList2.get(key));
}
  

Комментарии:

1. Это должен быть «Ключ объекта», а не строка, или вы должны использовать итератор<Строка>

2. Учитывая Map<String,List<String>> объявление, не так ли?

3. Вы получите ошибку компилятора, если не укажете тип для итератора. Итак, либо ключ объекта, либо итератор <Строка>

4. ах, да. Обработка итератора Java. Я думал о c .

5. Вы снова ошибаетесь 😉 Итератор<Строка> itr = commonKeys.iterator(); и строковый ключ = itr.next();