Как сравнить две карты и получить ключ от значения, которое встречается на обеих картах? - PullRequest
1 голос
/ 01 июля 2019
newPropertiesFile.keySet().parallelStream()
    .filter(value -> oldPropertiesFile.keySet().parallelStream()
            .filter(entry -> oldPropertiesFile.get(entry).toString().equals(newPropertiesFile.get(value).toString()))
            .filter(values -> !values.equals(value)).count() > 0)
    .collect(Collectors.toMap(entryKey -> (String) entryKey, entryKey -> newPropertiesFile.get(entryKey).toString()));

Например, у меня есть mapA = {(1,'a'),(2,'b'),(3,'c')} и mapB = {(5,'a'),(6,'d'),(7,'c')}. Сравнивая список значений обеих карт, значения 'a' и 'c' в mapA встречаются в mapB, а их ключи * 1008.* и 7 соответственно

И, следовательно, мои требуемые o / p:
5, 7

Я сделал выше и получил требуемый результат.Но Сложность слишком высока на O (n ^ 2).Какие-нибудь оптимизированные методы?

Более упрощенный пример:

mapA.keySet().parallelStream()
    .filter(v->mapB.keySet().parallelStream()
            .filter(e->mapB.get(v).equals(mapA.get(v)))
            .filter(v->!v.equals(v)).count()>0)
    .forEach(System.out::println);

1 Ответ

0 голосов
/ 01 июля 2019

Если я правильно понял:

При сравнении valueList обеих карт значения 'a' и 'c' в mapA встречаются в mapB, а их ключи равны 5 и 7 соответственно.И, следовательно, мои требуемые o / p: 5, 7

Разве недостаточно просто отфильтровать вторую карту со списком #, содержащим:

    Map<Integer,String> mapA = new HashMap<>();
    mapA.put(1, "a");
    mapA.put(2, "b");
    mapA.put(3, "c");
    Map<Integer,String> mapB = new HashMap<>();
    mapB.put(5, "a");
    mapB.put(6, "d");
    mapB.put(7, "c");

    List<Integer> list = mapB.entrySet().stream()
                             .filter(e->mapA.containsValue(e.getValue()))
                             .map(e -> e.getKey())
                             .collect(Collectors.toList());
    System.out.println(list);
...