使用Map [Int,String]中的最低键值获取值

时间:2013-06-19 20:07:17

标签: scala

说我有一张地图:Map[Int, String]。如何使用最低键[String]获取值[Int]。我一直在努力实现这个功能,但是无法弄清楚如何做到这一点。

4 个答案:

答案 0 :(得分:4)

以下代码将为您提供具有最低键的值(忽略某些极端情况)。

def lowestKeyMember[A](m: Map[Int,A]): A = m(m.keys.min)

这将任意打破关系,并抛出一张空地图。如果您需要经常和/或在大型地图上执行此操作,您应该查看SortedMap

答案 1 :(得分:2)

地图通常不会排序。但是,您可以使用SortedMap,然后将对地图进行排序,并将第一个值作为头部。你需要做的就是找回头部。

map.head()

答案 2 :(得分: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字母操作员?

让我们看看,那是否足够了?不要告诉我->就像-/:就像/

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)

答案 3 :(得分: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(并且编译器可以找到匹配的implict)。