假设我有一张地图:Map[Int, String]
。我将如何获得[String]
最低 key的价值[Int]
。我一直在尝试在功能上实现这一点,但就是不知道如何做到这一点。
问问题
951 次
4 回答
4
以下代码将为您提供具有最低键的值(忽略某些极端情况)。
def lowestKeyMember[A](m: Map[Int,A]): A = m(m.keys.min)
这将任意打破关系并扔在一张空地图上。如果您需要经常和/或在大型地图上执行此操作,您应该查看SortedMap
.
于 2013-06-19T20:13:12.800 回答
2
地图通常不排序。但是,您可以使用 SortedMap,然后对地图进行排序,第一个值将是头部。您需要做的就是取回头部。
map.head()
于 2013-06-19T20:18:07.537 回答
2
来吧,人们!“功能上”是“折叠”的代号。
scala> val m = Map(1->"eins",2->"zwei",3->"drei")
m: scala.collection.immutable.Map[Int,String] = Map(1 -> eins, 2 -> zwei, 3 -> drei)
scala> m.foldLeft(Int.MaxValue -> "") { case (min,p) => if (min._1 <= p._1) min else p }
res0: (Int, String) = (1,eins)
但是一个 8 字符的运算符?
让我们看看,这是否足够的parens?不要告诉我->
是喜欢-
和/:
喜欢/
。
scala> (Int.MaxValue -> "" /: m) { case (min,p) => if (min._1 <= p._1) min else p }
<console>:9: error: missing arguments for method /: in trait TraversableOnce;
follow this method with `_' if you want to treat it as a partially applied function
(Int.MaxValue -> "" /: m) { case (min,p) => if (min._1 <= p._1) min else p }
^
哦,好吧,好吧。
scala> ((Int.MaxValue -> "") /: m) { case (min,p) => if (min._1 <= p._1) min else p }
res2: (Int, String) = (1,eins)
或者,
scala> import math.Ordering.Implicits._
import math.Ordering.Implicits._
scala> ((Int.MaxValue -> "") /: m) { case (min,p) if min <= p => min case (_, p) => p }
res5: (Int, String) = (1,eins)
于 2013-06-20T01:53:19.727 回答
2
与选项一起使用的解决方案的变体_.keys.min
(即不会在空地图上抛出):
scala> val a : Map[Int, String]=Map(1 -> "1", 2 -> "2")
a: Map[Int,String] = Map(1 -> 1, 2 -> 2)
scala> val b : Map[Int, String]=Map()
b: Map[Int,String] = Map()
scala> def valueForMinKey[K,V](a : Map[K,V])(implicit cmp : Ordering[K]) = a.keys.reduceOption(cmp.min(_, _)).map(a(_))
valueForMinKey: [K, V](a: Map[K,V])(implicit cmp: Ordering[K])Option[V]
scala> valueForMinKey(a)
res27: Option[String] = Some(1)
scala> valueForMinKey(b)
res28: Option[String] = None
在此示例中,隐式参数cmp
将满足Ordering.Int
。该示例适用于任何可以对键进行排序的 Map(并且编译器可以找到匹配的隐含)。
于 2013-06-20T09:11:21.153 回答