2017-08-27 14 views
0

私が書いたケースクラスNodeがあり、そのリストを作成して最大ディスクを持つノードを見つける必要があります。 私は以下のコードを書いた、それを行う良い方法はありますか?また、私の実際の生産コードでは、私の "nodeList"変数はOption[List[Node]]だけでなく、Future[Option[List[Node]]]になります。私はまだ答え/コードは、私が地図/ flatMapをやって、未来に行って同じことをすることを除いて、あまり変わらないと思う。 誰かがScalaの方法でコードを書くより良い提案があれば、あなたの考えを分けてください。あなたが書いたコードから判断するケースクラスから最大値を取得するノードのリスト、スカラを返すOption [List]

scala> case class Node(disk: Integer, name: String) 

定義されたクラスノード

scala> val nodeList = Option(List(Node(40, "node1"), Node(200, "node3"),Node(60, "node2"))) 
nodeList: Option[List[Node]] = Some(List(Node(40,node1), Node(200,node3), Node(60,node2))) 

scala> val maxDisk = nodeList match { 
| case None => println("List is empty"); None 
| case Some(lst) => { 
| Some(lst.max(Ordering.by((_:Node).disk))) 
| } 
| }` 
maxDisk: Option[Node] = Some(Node(200,node3)) 

答えて

1

、私はあなたが本当にOptional[List[Node]]を使うべきかはわかりません。 Noneを空のListとして扱い、Someの場合は空のリストをチェックしていないようです。 List[Node]があなたの使用によく合っているかどうかを確認したい場合があります(はNilになり、Some(lst)はちょうどlstになります)、使用されていないSome(Nil)のケースは誰も混乱させません。

あなたがOptional[List[Node]]を維持した場合は、私はこのようにそれを行うだろう:

nodeList 
    .filterNot(_.isEmpty) // maxBy throws if the list is empty; check for it 
    .map(_.maxBy(_.disk)) // maxBy looks nicer than max(Ordering.by) 

あなたはList[Node]に切り替えると、それは少し醜いです:

Some(nodeList) 
    .filterNot(_.isEmpty) // We're using the filter utility of Option here, 
    .map(_.maxBy(_.disk)) // so I wrap with Some to get access to filterNot. 
+0

ありがとう。私は2つの質問があります。 1.私が行っているようにOption [List]を使用した場合、あなたの答えはより良い方法と考えられますか?これはあなたの答えに挑戦するのではなく、私のソリューションの機能があまり機能しないか、それほど望ましくない理由、そしてその理由を見極めることです。私自身の学習のためだけ 2.提案した2番目のアプローチは、オプションタイプIよりも優れていますか? 3.空リストの場合、私のゾルは壊れますか? – curiousengineer

+0

1:あなたが単にすべてを使っていないという理由だけで 'Option [List] 'を使わないことをお勧めします。 'None'を' Some(Nil) 'と区別する必要がある場合は、必ずそれを使用してください。使用するには大きすぎるデータ型を使用しないようにする必要があります(使用しない値があります)。 2:私の2番目の解決策は、 'List [Node]'に切り替えた場合のコードの様子を示しています。それは良くないか悪いです。違いは 'Option [List]'と 'List'の答えです。 3:はい、元の解決策はあなたが 'Some(Nil)'を持っていれば壊れます。 – HTNW

1

あなたがリストのパターンマッチングで再帰を使用することができます。

case class Node(disk: Integer, name: String) 
    val nodeList = Option(List(Node(40, "node1"), Node(200, "node3"),Node(60, "node2"))) 

    def findMaxValue(list: List[Node]): Option[Node] = list match { 
    case Nil => None 
    case List(x) => Some(x) 
    case first :: second :: rest => if(first.disk > second.disk) findMaxValue(first::rest) else findMaxValue(second::rest) 
    } 

    val node:Option[Node] = findMaxValue(nodeList.getOrElse(Nil)) 
    println(node.get.disk) //print 200 
関連する問題