次のタプルのリストがあります。
val arr = List(('a',10),('b',2),('c',3))
最大キーまたは最大値でタプルを見つける方法は?
適切な答えは、(c, 3)
辞書編集上の最大キーまたは('a', 10)
最大値です。
次のタプルのリストがあります。
val arr = List(('a',10),('b',2),('c',3))
最大キーまたは最大値でタプルを見つける方法は?
適切な答えは、(c, 3)
辞書編集上の最大キーまたは('a', 10)
最大値です。
簡単に:
scala> val list = List(('a',10),('b',2),('c',3))
list: List[(Char, Int)] = List((a,10), (b,2), (c,3))
scala> val maxByKey = list.maxBy(_._1)
maxByKey: (Char, Int) = (c,3)
scala> val maxByVal = list.maxBy(_._2)
maxByVal: (Char, Int) = (a,10)
したがって、基本的には、最大値を見つけるために使用されるList[T]
任意の関数T => B
(またはby exampleB
などの任意の順序付き型) に提供できます。Int
String
からScala 2.13
、少し安全な解決策 (空のリストを処理する) は、シーケンスが空の場合に返されるmaxByOption
/を使用することで構成されます。minByOption
None
List(('a', 10),('b', 2),('c', 3)).maxByOption(_._1)
// Option[(Char, Int)] = Some((c,3))
List[(Char, Int)]().maxByOption(_._1)
// Option[(Char, Int)] = None
このようにして、リストが空のときにデフォルト値にフォールバックすることもできます。
List[(Char, Int)]().maxByOption(_._1).getOrElse(('a', 1))
// (Char, Int) = (a,1)
間違いなく @ om-nom-nomが簡潔で正しい答えを提供してくれました。ただし、空のリストに対しては例外がスローされます。
編集#2私の最初の編集を考えると、元の欠陥のある答えを書き直す価値があります:
def max[A](list: List[(A, Int)]): Option[Int] = list match {
case Nil => None
case x :: xs => { val result = xs.foldLeft(x._2) { // acc = first item in list
(acc, elem) => if(elem._2 > acc) elem._2 else acc
}
Some(result)
}
}
注: scalazでは の代わりにより一般的な-like型を使用できるようになると思いますが、まったく使用していません。 Num
Int
テスト
scala> val list = List(('a',10),('b',2),('c',3))
list: List[(Char, Int)] = List((a,10), (b,2), (c,3))
scala> max(list)
res5: Option[Int] = Some(10)
scala> val list: List[(String, Int)] = Nil
list: List[(String, Int)] = List()
scala> max(list)
res6: Option[Int] = None
編集開始値を選択するために、@ DustinGetzと話した後、回答を編集することにしました。
選択は、アプリInt.MinValue
が実行されている特定の OS/システムに依存するため、適切な選択ではない場合があります。
リストの最初の要素が開始値であるべきだと私は主張します。ただし、リストが空の場合は、ランタイム例外が発生する可能性があります。
詳細については、 https://stackoverflow.com/a/23184020/409976の投稿をご覧ください。