2016-11-16 12 views
1

リストの束の最大整数値を取得したい。多くのリストから最大の整数値を取得する

どうすればいいですか?リストのいくつかは空であるかもしれないことに留意してください。

私は何かを試してみましたが、私はなっていた。

java.lang.UnsupportedOperationException: empty.max 

だから、私は同じようにリストの束を持っている:

val l1 = List.empty 
val l2 = List(1,2,3) 
val l3 = List(4,5,6) 
val l4 = List(10) 

私は現在、これをやっている:

(l1 ++ l2 ++ l3).max 
+1

@GabrielePetronella私の質問が更新されました。リストが空の場合は、エラーが発生します。 –

答えて

0

場合あなたはすべてのリストが空である例外に遭遇していますが、これはそれを解決します:

(0 :: l1 ++ l2 ++ l3).max 

すべてが空の場合、デフォルト値0にしたいと仮定します。

+0

これはポイントがありません、それはOPが既に試みたのとまったく同じソリューションです。この問題は、すべてのリストが空の場合に発生します。 –

+0

@ GabrielePetronella私が掲載したコードは、OPによって掲示されたコードによって生成された例外を修正しています(この例では投稿されています)。問題はすべてのリストが空であることは明らかではない。それは確かにOPが投稿したものではない。いずれにしても、私はその場合の解決策も含めます。 –

+0

OPの投稿が空リストのmaxを実行して派生した例外( 'List.empty [Int] .max'を試してください)。 OPがすでにリストを連結しているので、問題はすべてのリストが空であることがある(問題のコメントで確認されているように)。 –

4

すべてのリストが空の場合、maxは存在しない可能性がありますので、結果をOption[Int]としてモデル化できます。一般的なユースケースであるので、あなたは、代わりreduceOptionを使用することができますアドホックコンビネータがあります空でないかのように、

val max: Option[Int] = List(l1, l2, l3, l4).flatten match { 
    case Nil => None 
    case list => Some(list.max) 
} 

List上で操作を実行する:ここで

はそれを行うための簡単な方法ですあなたはワンライナーに興味があれば、あなたが行うことができます

:ジャンLogeartの答えによって提案

val max: Option[Int] = List(l1, l2, l3, l4).flatten.reduceOption(_ max _) 

が、私は私は個人的に読むのが簡単だと思うので、最初の(もっと冗長な)解決策を好むでしょう。


デフォルトの結果を持ちたい代わり場合、あなたはデフォルトで始まる平坦化Listを超える折ることができます。

val max: Int = List(l1, l2, l3, l4).flatten.foldLeft(0)(_ max _) // 0 or any default 

または代わりに、ちょうどあなたの元の溶液に0を付加

val max = (0 :: l1 ++ l2 ++ l3).max 
+0

デフォルトで0になっている場合は、List(0)を追加してソリューションを正しく保つことができますか? –

+1

はい、強制的にリストを空でなくても動作させることができます。それ以外の場合、 'List(l1、l2、l3、l4).flatten.foldLeft(0)(_ max _)'を実行することができます –

+0

注:最初の解決策は、 (最大演算子なし)。 – Suma

-1

ここでは、オプション:try/catchを使用してmax:

を見つける方法があります
scala> val l = List(List.empty, List(1,2,3), List(4,5,6), List(10)) 
l: List[List[Int]] = List(List(), List(1, 2, 3), List(4, 5, 6), List(10)) 

scala> l.flatMap(x => try{ Some(x.max) } catch {case _ => None}).max 
res0: Int = 10 

以下のコメントを考慮して、制御フローに例外を使用しないでください。 Gabriele Petronella's solutionを使用することをお勧めします。

+1

リストが空であるかどうかを単に確認できるときに例外をキャッチする必要はありません。 –

+1

http://softwareengineering.stackexchange.com/questions/189222/are-exceptions-as-control-flow-considered-a-serious-antipattern -if-so-why – Dylan

+0

よく聞かれた点、フィードバックありがとう! –

3

すべてのリストを空にすることができる場合:

val max: Option[Int] = Seq(l1, l2, l3, l4).flatten.reduceOption(_ max _) 
1

ほとんどすべて他の回答の中間リストを作成するflattenflatMapを使用しています。すべてのリストがかなり大きい場合、それは不必要なメモリーオーバーヘッドです。私のソリューションはイテレータを使用して、途中で余分な割り当てを避けます。

val list = List(l1, l2, l3, l4) 
val max = list.iterator.flatMap(_.iterator).reduceOption(_ max _) 

コメントで指摘したように、.flatMap(_.iterator)は実際flattenに置き換えることができます。イテレータで呼び出されているので、結果は完全なリストではなく、別のイテレータです。

+0

私のリストは小さく、10点以下ですが、よく取られています! –

+1

'flatten'は' flatMap(_。iterator) 'と同じことをします。 –

関連する問題