Лучший способ проверить список значений, представленных на карте - PullRequest
2 голосов
/ 15 мая 2019

У меня есть Collection, содержащий некоторые значения.

Collection<String> myList = new ArrayList<String>();
myList.add("a");
myList.add("b");
myList.add("c");

Я создал Map, который имеет несколько значений:

Map<String, String> myMap = new HashMap<String, String>();
myMap.put("r", "r");
myMap.put("s","m");
myMap.put("t", "n");
myMap.put("a", "o");

Я хочу проверить, присутствуют ли значения в списке в качестве ключа на карте? Способ, который я знаю с помощью Java, состоит в том, чтобы перебирать список и проверять, содержит ли карта это конкретное значение, используя myMap.containsKey (). Я хочу знать, есть ли что-нибудь, использующее потоки или для каждого, которое спасет меня или в строках кода, или в эффективном способе сделать это! Спасибо за продуманность.

EDIT: Я хочу сохранить все элементы, присутствующие в myList, которых нет в myMap. Таким образом, мой вывод может быть списком, например, в этом сценарии [b,c].

Ответы [ 4 ]

2 голосов
/ 16 мая 2019
Set<String> mySet = new HashSet<String>(myList);
myMap.keySet().containsAll(set);

Это отвечает на ваш вопрос?

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

1 голос
/ 16 мая 2019

Для: я хочу сохранить все элементы, присутствующие в myList, которые нет в моей карте. Таким образом, мой вывод может быть списком, например, в этом сценарии [Ь, с]

Создайте дубликат myList и удалите все ключи myMap

        Collection<String> newList = new ArrayList<>(myList);
        newList.removeAll(myMap.keySet());
        System.out.println(newList);
1 голос
/ 16 мая 2019

... присутствуют ли значения в списке в качестве ключа на карте?

Как я понимаю, в этом случае вам необходимо проверить, является ли все элементы в myList присутствуют как ключи myMap.Используйте метод Stream::allMatch:

myMap.keySet().stream()
              .allMatch(myList::contains);

..., который совпадает с:

myList.keySet().containsAll(myMap);

РЕДАКТИРОВАТЬ: Я хочу сохранить всеэлементы, присутствующие в myList, которых нет в myMap.Таким образом, мой вывод может быть списком, например, в этом сценарии [b, c].

Вы не хотите хранить все элементы в myList, так как они уже заполнены.Вы хотите сохранить этих элементов, используя List::retainAll.

myList.retainAll(myMap.keySet());

Распечатка результата myList приведет к только ключам , которые были найдены в оригинале myList, а также как ключ myMap.

0 голосов
/ 15 мая 2019

Используя Потоки , вы можете сделать что-то вроде:

List<String> result = myList.stream()                
                            .filter(myMap::containsKey)
                            .collect(Collectors.toList());

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

Если вы хотите распечатать их, вы можете сделать:

result.forEach(System.out::println);
...