HashMap. Найти ключи, которые имеют одинаковые значения между двумя хэш-картами - PullRequest
1 голос
/ 17 февраля 2020

Давайте рассмотрим, что у нас есть две хэш-карты, как показано ниже:

 HashMap<String, Integer> map1  = new HashMap<>(); 
 map1.put("vishal", 10); 
 map1.put("sachin", 30); 
 map1.put("vaibhav", 20); 

 HashMap<String, Integer> map2  = new HashMap<>(); 
 map2.put("Raja", 10); 
 map2.put("John", 30); 
 map2.put("Krishna", 20); 

"Вайбхав" из map1 и "кришна" из map2 имеют одинаковые значения.

Мне нужно найти ключи с обеих карт, которые имеют одинаковые значения. В данном случае «вайбхав» и «Кришна».

Спасибо.

Ответы [ 3 ]

3 голосов
/ 17 февраля 2020

Группировка по значениям и сохранение ключей в списке:

Stream.of(map1.entrySet(), map2.entrySet())
.flatMap(Collection::stream)
.collect(Collectors.groupingBy(
        Map.Entry::getValue,
        Collectors.mapping(
                Map.Entry::getKey,
                Collectors.toList()
        )
));

Будет создано:

{20=[vaibhav, Krishna], 10=[vishal, Raja], 30=[sachin, John]}

ОБНОВЛЕНИЕ

Другой подход

Map<Integer, List<String>> collect = new HashMap<>();
map1.entrySet().forEach(e -> collect
        .computeIfAbsent(e.getValue(), k -> new ArrayList<>())
        .add(e.getKey()));
map2.entrySet().forEach(e -> collect
        .computeIfAbsent(e.getValue(), k -> new ArrayList<>())
        .add(e.getKey()));
1 голос
/ 17 февраля 2020

Вы можете увеличить сложность времени до O(n + m), где n - это размер первой карты, а m - это размер второй карты.

  • Мы можем добиться этого, сделав values в качестве ключей и keys в качестве значений.
  • Шаги:
    • Итерация по каждой карте.
    • Сохранение всех текущих значений карты на новой карте, сбор всех ключей, имеющих это значение, в списке и помещение текущего значения. с этим списком на новой карте.
    • Теперь переберите любой из новых наборов карт и получите общие ключи и соответствующие значения для печати. ​​

Фрагмент:

private static void showCommonValueKeys(HashMap<String, Integer> map1,HashMap<String, Integer> map2){
    Map<Integer,List<String>> map1Collect = flipKeyValue(map1);
    Map<Integer,List<String>> map2Collect = flipKeyValue(map2);

    for(Map.Entry<Integer,List<String>> m : map1Collect.entrySet()){
        int key = m.getKey();
        if(map2Collect.containsKey(key)){
            System.out.println("For value " + key);
            System.out.println("First map keys: " + m.getValue().toString());
            System.out.println("Second map keys: " + map2Collect.get(key).toString());
            System.out.println();
        }
    }

}

private static  Map<Integer,List<String>> flipKeyValue(HashMap<String, Integer> map){
     Map<Integer,List<String>> mapCollect = new HashMap<>(); 

     for(Map.Entry<String,Integer> m : map.entrySet()){
        String  key = m.getKey();
        int val = m.getValue();
        mapCollect.putIfAbsent(val,new ArrayList<>());
        mapCollect.get(val).add(key);
     }

     return mapCollect;
}

Демонстрация: https://onlinegdb.com/SJdcpbOXU

0 голосов
/ 17 февраля 2020

Этого можно добиться с помощью двух циклов for со сложностью n * m, где nm - размер каждой карты.

Map<String, String> map1 = new HashMap<>();
map1.put("santhosh", "1");
map1.put("raja", "2");
map1.put("arun", "3");


Map<String, String> map2 = new HashMap<>();
map2.put("kumar", "1");
map2.put("mani", "1");
map2.put("tony", "3");

for (Map.Entry<String, String> entry1 : map1.entrySet()) {
  String key1 = entry1.getKey();
  String value1 = entry1.getValue();

  for (Map.Entry<String, String> entry2 : map2.entrySet()) {
    String key2 = entry2.getKey();
    String value2 = entry2.getValue();

    if (value1 == value2) {
      System.out.println(key1 + " " + key2);
    }
    }

Спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...