2017-02-06 3 views
4

Я написал следующий метод, чтобы найти сопоставление ключей с наивысшими значениями и попытаться преобразовать в поток java. Не могли бы вы помочь?Использование Java8 Stream для поиска наивысших значений по карте

private List<Integer> testStreamMap(Map<Integer, Long> mapGroup) { 
    List<Integer> listMax = new ArrayList<Integer>(); 
    Long frequency = 0L; 
    for (Integer key : mapGroup.keySet()) { 
     Long occurrence = mapGroup.get(key); 
     if (occurrence > frequency) { 
      listMax.clear(); 
      listMax.add(key); 
      frequency = occurrence; 
     } else if (occurrence == frequency) { 
      listMax.add(key); 
     } 
    } 
    return listMax; 
} 
+2

Ваш вопрос непонятен, тот же параметр, который вы назвали 'occurance' (который является орфографическим btw), вызывается во второй реализации' tempValue'. И параметр, который вы назвали 'frequencyence '(который также ошибочно написан) в первой реализации, называется« появление »во втором. Начните с соответствия вашим именам, и это может помочь вам решить вашу путаницу. – alfasin

+1

«Ключ с наивысшим появлением»?, Я думаю, вы пытаетесь выяснить «значение» с наивысшим значением, когда вы вызываете «mapGroup.get (key)». Верный? –

+0

@ShyamBaitmangalkar да, попробуйте найти список ключей с наивысшим результатом – Dumy

ответ

7

Вы можете получить один ключ через

Integer max=mapGroup.entrySet().stream().max(Map.Entry.comparingByValue()).get().getKey(); 

но, к сожалению, нет встроенной функции для получения всех эквивалентных максимумов.

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

private List<Integer> testStreamMap(Map<Integer, Long> mapGroup) { 
    if(mapGroup.isEmpty()) 
     return Collections.emptyList(); 
    long max = mapGroup.values().stream().max(Comparator.naturalOrder()).get(); 
    return mapGroup.entrySet().stream() 
     .filter(e -> e.getValue() == max) 
     .map(Map.Entry::getKey) 
     .collect(Collectors.toList()); 
} 

Solutions для получения всех максимальных значений потока в один проходе, является обсуждается в «How to force max() to return ALL maximum values in a Java Stream?». Вы увидите, что однопроходные решения намного сложнее и не стоят усилий, если ваш вход является обычным Map (например, HashMap), который можно многократно повторять по несколько раз.

8

Я не уверен, что половина код пытается сделать, но ответить на ваш вопрос в заголовке, который я предполагаю, должен был быть «найти запись с наибольшим значением»:

Map.Entry<Integer, Long> maxEntry = map.entrySet().stream() 
    .max(Map.Entry.comparingByValue()).get(); 
+1

Upvote for the clarity !! Существует небольшая опечатка «gey()». –

+1

@ShyamBaitmangalkar iPhone. Thx – Bohemian

+0

Ха да! Я могу понять!! –