Getting the maximum key value pair in a Scala map by value
14,389
Solution 1
You can use maxBy
with a function from the key-value pair to just the value:
val map = Map('a' -> 100, 'b' -> 23, 'z' -> 56)
map.maxBy(_._2) // (a,100)
This is a short form for
map.maxBy { case (key, value) => value }
Solution 2
A slight modification in case the max value you are looking for is present more than once in the map:
// Find the entries with the max value in the map
val maxValue = map.maxBy(item => item._2)
// Filter the map and retain the entries with the max value
map.filter(item => item._2 == maxValue._2)
Related videos on Youtube
Author by
pmaurais
Updated on June 04, 2022Comments
-
pmaurais almost 2 years
I am trying to pull the maximum value form a map along with its key. For example:
val map = Map('a' -> 100, 'b' -> 23, ... 'z' -> 56)
Where 100 is the largest value, how would I go about pulling ('a',100)? I essentially want to use Map.max but search by value rather than key.
-
pmaurais over 7 yearsPerfect, that works! I do have to ask, where are you getting the syntax for the predicate passed to maxBy()?
-
0__ over 7 yearsIf you look into the API docs, you find for
Map[A, B]
:def maxBy[C](f: ((A, B)) ⇒ C)(implicit cmp: Ordering[C]): (A, B)
- the doc formatting is broken, I'm afraid, so I wrote the correct form here with a fresh type parameterC
. So you pass a function from the tuple of (key, value) to any other value for which an ordering exists.map.maxBy(_._2)
then is just the short form formap.maxBy { case (key, value) => value }
. -
Victor over 5 yearsHi, what about if 100 is present for more than one key? Is it possible to get all values instead of just one? Thanks!
-
0__ over 5 years@Victor You'd determine the maximum value first and then filter the map; e.g.
val map = Map('a' -> 100, 'b' -> 23, 'z' -> 56, 'c' -> 100); val maxVal = map.valuesIterator.max; map.filter(_._2 == maxVal)