Java Hashmap: получить все ключи больше значения X - PullRequest
0 голосов
/ 19 февраля 2019
 import java.util.*;
 import static java.lang.String.format;

 public class Dumpground {

     private static final String[] fruits = new String[]{"apples", "bananas", "grapes", "oranges", "watermelons", "kiwis"};
     static Map<String, Long> expirationMap;

     public static void main(String[] args) {
         long expiration = 1L;
         expirationMap = new HashMap<>();
         for (String fruit : values()){
             expirationMap.put(fruit, expiration);
             expiration++;
         }
         for (Map.Entry<String, Long> item : expirationMap.entrySet()) {
               String key = item.getKey();
               Long value = item.getValue();
               System.out.println(format("key: %s, value: %s", key, value));
           }


     }

     public static String[] values() {return fruits;}
 }

OUTPUT

key: oranges, value: 4
key: watermelons, value: 5
key: kiwis, value: 6
key: bananas, value: 2
key: apples, value: 1
key: grapes, value: 3

Я пытаюсь найти умные способы поиска всех ключей, где его значения больше, чем X

, например, если X == 3,он должен возвращать апельсины, арбузы и киви

очевидный способ - просто перебирать карту и сравнивать значение, но есть ли простой, краткий способ сделать это?

Ответы [ 5 ]

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

Другим подходом помимо того, что сделали другие, может быть использование Interface Predicate<T>, чей метод по умолчанию test(T t) может использоваться для оценки значений, превышающих 3.

  Predicate<Long> filterGreater3 = f-> f>3;
  expirationMap.entrySet()
               .stream()
               .filter(x->filterGreater3.test(x.getValue()))
               .forEach(System.out::println);
0 голосов
/ 19 февраля 2019

Ниже приведен другой читабельный подход.

expirationMap.forEach((key, value) -> {
     if (value > x) {
         System.out.println(format("key: %s, value: %s", key, value));
     }
});

. Часть .forEach будет перебирать элемент entrySet () карты и извлекать ключ и значение каждой записи соответственно в (ключ, значение).

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

потоков, да.Используйте

expirationMap.entrySet().stream()
    .filter(entry -> entry.getValue() > 3L)
    .map(Entry::getKey)
    .collect(Collectors.toList());

, чтобы получить список ключей.

Нам нужно выполнять потоковую передачу по элементам карты, а не только по значениям или ключам, потому что нам нужно сравнить единицу (значение) и вернуть другой (ключ).Хорошо, одному не нужно , как указано в комментариях.

Метод filter получает значение и сравнивает его с 3, отбрасывая элементы не более 3;и затем мы сопоставляем записи с их значениями, используя метод map.Наконец, мы собираем результат в List.

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

Немного другой вариант с использованием только набора и поиска ключа:

Set<String> greppedKeys = expirationMap.keySet().stream() // keyset only
        .filter(key -> expirationMap.get(key) > 3L) // X here being 3L
        .collect(Collectors.toSet()); // all keys would be unique anyway
0 голосов
/ 19 февраля 2019

Это будет сделано с помощью потоков:

expirationMap.entrySet().stream().filter(e -> e.getValue() > 3)
             .forEach(e -> {
                 System.out.println("key " + e.getKey() + "value" + e.getValue());
              });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...