マップがあるとします: Map[Int, String]
. [String]
最低のキーで値を取得するにはどうすればよいですか[Int]
。これを機能的に実装しようとしていますが、これを行う方法がわかりません。
質問する
951 次
4 に答える
4
次のコードは、最も低いキーを持つ値を取得します (いくつかのコーナー ケースを無視します)。
def lowestKeyMember[A](m: Map[Int,A]): A = m(m.keys.min)
これにより、任意に関係が解消され、空のマップがスローされます。この操作を頻繁に、または大規模なマップで行う必要がある場合は、 を調べる必要がありますSortedMap
。
于 2013-06-19T20:13:12.800 に答える
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 に答える
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)
于 2013-06-20T01:53:19.727 に答える
2
通常、マップはソートされません。ただし、SortedMap を使用すると、マップがソートされ、最初の値が head になります。あなたがする必要があるのは、頭を取り戻すことだけです。
map.head()
于 2013-06-19T20:18:07.537 に答える