2016-12-07 4 views
0

Я отсортировал HashMap со следующими параметрами.Фильтрация определенных предметов с карты - Java8 StreamAPI

map.entrySet() 
      .stream() 
      .sorted(Map.Entry.comparingByValue(Collections.reverseOrder())) 
      .skip(1) 
      .limit(50) 
      .collect(Collectors.toMap(
        Map.Entry::getKey, 
        Map.Entry::getValue, 
        (e1, e2) -> e1, 
        LinkedHashMap::new 
      )); 

То, что я хочу сделать, это фильтр некоторые результаты этого, предпочтительно с использованием .filter(). Элементы, которые я хочу фильтровать, - ArrayList<String> filterUs;

Как это сделать?


Предположим, что я получил следующий результат после операции сортировки

{31795=11, 31790=11, 31876=10, 31803=9, 31792=8, 31877=8, 31851=8, 31845=8} 
filterUs = [31790,31876] 

Что я хочу получить: {31795=11, 31803=9, 31792=8, 31877=8, 31851=8, 31845=8, newItem=7, anotherNewItem=6}

+0

Немного неясно. filterUs содержит * 31790 *, и результат, который вы хотите получить, содержит эту запись: * 31790 = 11 *. это что-то типа? Я думаю, что вы имели в виду: * filterUs = [31803,31876] * – Eugene

ответ

1

Это выглядит смешно, вы поднимете довольно сложный трубопровод там, и вы не можете сделать фильтр? Если я не пропущу что-то, это довольно просто.

Map<Integer, Integer> result = map.entrySet().stream() 
      .sorted(Map.Entry.comparingByValue(Collections.reverseOrder())) 
      .filter(entry -> !filterUs.contains(entry.getKey())) 
      .skip(1) 
      .limit(50) 
      .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (e1, e2) -> e1, LinkedHashMap::new)); 
+0

спасибо, умный S –

0

Добавить

.filter(item -> item.getValue() instanceOf ArrayList) 

к потоку.

Результат будет содержать только записи, которые составляют ArrayList. Инвертируйте тест (добавьте ! после ->), если вы хотите их удалить.

+0

Спасибо, но то, что я хотел сделать, это удалить фильтр, так что '{31795 = 11, 31790 = 11, 31876 = 10, 31803 = 9, 31792 = 8, 31877 = 8, 31851 = 8, 31845 = 8} 'был исходным результатом, я хочу удалить' filterUs = [31803,31876] ' –

0

Чтобы использовать его, вы бы реализовать что-то вдоль линий

map.entrySet() 
     .stream() 
     .sorted(Map.Entry.comparingByValue(Collections.reverseOrder())) 
     .skip(1) 
     .filter(entry -> item.getValue() instanceOf ArrayList) // <-- NEW 
     .limit(50) 
     .collect(Collectors.toMap(
       Map.Entry::getKey, 
       Map.Entry::getValue, 
       (e1, e2) -> e1, 
       LinkedHashMap::new 
     )); 
+0

вы можете проверить обновленный вопрос? –

+1

кричит. плохое время, чтобы отдохнуть от SO. Прости! –

Смежные вопросы