Отфильтровать результат из карты с несколькими условиями - PullRequest
0 голосов
/ 01 февраля 2019

У меня есть карта со списком empid и name.Я хочу выбрать только emp name людей, чье id больше 7 и имя начинается с N. Результат должен быть SET.

Я пытался использовать map.entryset(), но не могу придумать, как фильтровать внутри карты.

Должны ли мы использовать, если еще?Как мы вернемся к множеству, если найдено несколько элементов?

Ответы [ 4 ]

0 голосов
/ 01 февраля 2019

Очень легко сделать с помощью простого цикла for:

Map<Integer, String> map = ...
Set<String> result = new HashSet<>();
for(Map.Entry<Integer, String> entry : map.entrySet()){
    if(entry.getKey() > 7){
        String name = entry.getValue();
        if(name.charAt(0) == 'N'){
            result.add(name);
        }
    }
}

Примечание : если имена могут быть пустыми (length() == 0), тогда подход name.charAt(0) будетне работает, как вы получите StringIndexOutOfBoundsException

0 голосов
/ 01 февраля 2019

Это должно быть примерно так,

Set<String> selectedEmps = empIdToName.entrySet().stream()
    .filter(e -> e.getKey() > 7)
    .filter(e -> e.getValue().startsWith("N"))
    .map(Map.Entry::getValue)
    .collect(Collectors.toSet());
0 голосов
/ 01 февраля 2019

Если я правильно вас понимаю, вот решение: предположим, у нас есть эти данные:

Map<String, List<Integer>> map = new HashMap<>();

map.put("Noo", new ArrayList<>(Arrays.asList(8,8,9)));
map.put("No", new ArrayList<>(Arrays.asList(1,8,9)));
map.put("Aoo", new ArrayList<>(Arrays.asList(8,8,9)));

Мы можем отфильтровать данные следующим образом:

map.entrySet().
            stream()
            .filter(e -> e.getKey().startsWith("N"))
            .filter(e -> e.getValue().stream().filter(id -> id <= 7).findAny().orElse(0) == 0)
            .map(Map.Entry::getKey)
            .collect(Collectors.toSet());

Первый фильтр исключаетИмена, которые не начинаются с "N", второй фильтр проходит через оставшиеся записи и проверяет, все ли ids больше 7. В foreach я просто печатаю данные, но вы можете изменить логику в соответствии с вашими потребностями

Результат должен выглядеть так:

Noo [8, 8, 9]
0 голосов
/ 01 февраля 2019
Map<Integer, String> nameMap = new HashMap<>(); //A dummy map with empid and name of emp
public static void main(String[] args) {
    nameMap.put(1,"John");
    nameMap.put(2,"Doe");
    nameMap.put(37,"Neon");
    nameMap.put(14,"Shaun");
    nameMap.put(35,"Jason");
    nameMap.put(0,"NEO");
    Set<String> empSet = nameMap.entrySet()
                        .stream()
                        .filter(x->x.getKey()>7 && x.getValue().startsWith("N"))
                        .map(x->x.getValue())
                        .collect(Collectors.toSet());
    empSet.forEach(System.out::println);
}

Фактическая реализация и пространства имен будут отличаться, но основные операции останутся прежними.

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