2017-12-31 181 views
0

のいくつかのListBuffer [ロング]コードのこの作品は、正常に動作し、期待通り343423を返すに最大を取得:Scalaの

val longList: ListBuffer[Long] = ListBuffer(103948,343423,209754) 
val maxLong = longList.max 

しかし、それはいくつかのために動作しません[ロング]:

val longSomeList: ListBuffer[Some[Long]] = ListBuffer(Some(103948),Some(343423),Some(209754)) 
val maxSomeLong = longSomeList.max 

Error: No implicit Ordering defined for Some[Long].
val maxSomeLong = longSomeList.max

2番目のリストの最大値を取得する簡単な方法はありますか? TraversableForwarder(scala.collection.generic)から

MAX関数

答えて

1

あなたが.flattenを探しています。

longSomeList.flatten.max 

それともそれを明示的に使用する順序を与える:

longSomeList 
    .max(Ordering.by[Option[Int], Int](_.getOrElse(Int.MinValue))) 

また、変更可能なコレクションを使用しないでください。

1
longSomeList.collect { case Some(n) => n }.max 
2

実際のシナリオでは、ListBuffer[Some[Long]]がありますか?あなたはちょうど同様にListBuffer[Long]を持つことができます。

これは動作します:

val longSomeList: ListBuffer[Option[Long]] = ListBuffer(Some(103948),Some(343423),Some(209754)) 
val maxSomeLong = longSomeList.max 
+0

私はjsonファイルを持っていましたが、これは* Some [Long] *のリストに解析されています。あなたは正しい、それは* Option [Long] *のために働く。これはとても混乱します:D私はいくつかの基礎を勉強する必要があります。 –

+0

ライブラリは 'Some [Long]'に解析しますか?あなたが静的に知っているなら、それはいつも「ある人」になるだろう。ボクシングの余分なレベルを持つことは理にかなっていない。 –

+0

* scala.util.parsing.json ._ *から* parseFull *を使用しましたが、常に* Some *を得るのは意味がありません。あなたの心には何か提案がありますか? –

1

問題は、あなたが定義されていないタイプSome[Long]、の要素を注文しようとしているです。ですから、これらを注文する方法を知っているようにコンパイラに指示してい:

scala> Some(1) < Some(2) 
<console>:8: error: value < is not a member of Some[Int] 
       Some(1) < Some(2) 
        ^

あなたは何ができるかLong

longSomeList.flatten.max 

または同様に、あなたの暗黙の順序を定義するために取得するためにSome Sをアンラップのいずれかです:

implicit object Ord extends Ordering[Some[Long]] { 
    def compare(a: Some[Long], b: Some[Long]) = a.getOrElse(Long.MinValue) compare b.getOrElse(Long.MinValue) 
} 

、その後:

scala> longSomeList.max 
res12: Some[Long] = Some(343423)