Проверьте ключи на карте, совпадающие с содержимым Списка в Java - PullRequest
0 голосов
/ 11 января 2019

У меня есть List из Strings и Map. Каждый ключ на карте должен быть представлен в списке, иначе мне нужно создать исключение. На данный момент я зацикливаю список и проверяю ключ и выбрасываю исключение, если карта не содержит ключ. Ниже приведен пример кода, который я делаю. Есть ли другой способ в Java8 , мы можем сделать это в одну строку или что-то, используя streams и filters?

А также содержимое списка и ключи на карте должны совпадать. То, что я уже обрабатываю в отдельном условии if.

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class TestClass {

    public static void main(String[] args) {

        List<String> ll = new ArrayList<>();
        Map<String, Integer> m = new HashMap<>();
        ll.add("a");
        ll.add("b");
        ll.add("d");

        m.put("a", 1);
        m.put("b", 1);
        m.put("c", 1);

        if(ll.size() != m.size){
       System.out.println("Throw Exception");
         }

        for(String s : ll) {

            if(!m.containsKey(s)) {
                System.out.println("Throw Exception");
            }
        }
    }
}

Ответы [ 6 ]

0 голосов
/ 11 января 2019

Вот еще одно решение:

    if (ll  .parallelStream()
            .filter(v -> !m.containsKey(v)) // Filter alle values not contained in the map
            .count() == 0) { // If no values are left then every key was present
        // do something
    } else {
        throw new RuntimeException("hello");
    }

Просто хотел показать другой подход

0 голосов
/ 11 января 2019

Попробуйте это:

if ((ll == null && m == null) ||                            // if both are null
   ((ll.size() == m.size() && m.keySet().containsAll(ll)))  // or contain the same elements
) {
    System.out.println("Collections contain the same elements");
} else {
    throw new CustomException("Collections don't match!");
}
0 голосов
/ 11 января 2019

Каждый ключ на карте должен присутствовать в списке, иначе мне нужно бросить исключение

Вы можете сделать это, используя Stream.anyMatch и итерируя на keyset карты вместо этого как (имена переменных обновлены для удобства чтения):

if(map.keySet().stream().anyMatch(key -> !list.contains(key))) {
    throw new CustomException("");
}

Лучше и проще, используйте List.containsAll:

if(!list.containsAll(map.keySet())) {
    throw new CustomException("");
} 

Важно : Если вы можете обменять на O(n) пространство, чтобы уменьшить сложность времени выполнения, вы можете создать HashSet из вашего List и затем выполнить поиск. Это уменьшит сложность среды выполнения с O(n^2) до O(n), а реализация будет выглядеть следующим образом:

Set<String> allUniqueElementsInList = new HashSet<>(list);
if(!allUniqueElementsInList.containsAll(map.keySet())) {
    throw new CustomException("");
}
0 голосов
/ 11 января 2019

Просто используйте следующее: -

m.keySet().stream().filter(e -> !ll.contains(e))
                   .findAny()
                   .ifPresent(e -> throwException("Key Not found : " + e));

И определить метод throwException ниже:

public static void throwException(String msg) {
    throw new RuntimeException(msg);
}
0 голосов
/ 11 января 2019

Мы можем попытаться добавить список в набор, а затем сравнить его с набором ключей из вашей хэш-карты:

List<String> ll = new ArrayList<>();
ll.add("a");
ll.add("b");
ll.add("d");

Map<String, Integer> m = new HashMap<>();
m.put("a", 1);
m.put("b", 1);
m.put("c", 1);

Set<String> set = new HashSet<String>(ll);

if (Objects.equals(set, m.keySet())) {
    System.out.println("sets match");
}
else {
    System.out.println("sets do not match");
}
0 голосов
/ 11 января 2019

Вы можете просто изменить существующий код на -

if(!m.keySet().containsAll(ll)) {
    System.out.println("Throws Exception");
}

Это решит вашу проблему. :)

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