How do I find the largest number from a list and its occurrences using lambdas?

menteith :

Please find below a code that counts the number of occurrences of numbers in a stream and returns a map with the number as the key and the value as its occurrences across the stream:

Map<Integer, Long> collect = Stream.of(1, 2, 3, 4, 4, 55555, 12)
                .collect(groupingBy(Function.identity(), counting()));

How do I limit the resulting map to only the biggest number (or numbers in case of a tie)?

MS90 :

Take a look at this simple example:

public static void getMeNumbersWithHighestFrequence3(int[] numbers, int howMany) {

    Map<Integer, Long> collect = IntStream.of(numbers).boxed().collect(groupingBy(Function.identity(), TreeMap::new, counting())).descendingMap().entrySet().stream()
            .limit(howMany)
            .collect(TreeMap::new, (map, entry) -> map.put(entry.getKey(), entry.getValue()), Map::putAll);

}

You could also somehow search for them by putting a filter value and it will take all entries with key values greater than that value, something like:

  public static void getMeNumbersWithHighestFrequenceByFilterNumber(int[] numbers, int value) {

        Map<Integer, Long> collect = IntStream.of(numbers).boxed().collect(groupingBy(Function.identity(), TreeMap::new, counting())).descendingMap().headMap(value, true);

    }

Simple usage:


public static void main(String[] args) {
        int[] numbers = {1, 2, 3, 4, 4, 55555, 12};
        getMeNumbersWithHighestFrequence(numbers, 5);
    }

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=166958&siteId=1