2017-01-17 14 views
-3

誰もが!オブジェクトを見つけるのに最適な方法が必要です

私は3つのクラスがあります。

case class Foo(id: String, bars: Option[List[Bar]]) 
case class Bar(id: String, buzzes: Option[List[Buz]]) 
case class Buz(id: String, name: String) 

そしてコレクション:

val col = Option[List[Foo]] 

私が取得する必要があります:

val search: String = "find me" 
val (x: Option[Foo], y: Option[Bar], z: Option[Buz]) = where buz.name == search ??? 

ヘルプを

UPD :)をしてください。 私は、JSON

{ 
    "foos": [{ 
     "id": "...", 
     "bars": [{ 
      "id": "...", 
      "buzzes": [{ 
       "id": "...", 
       "name": "find me" 
      }] 
     }] 
    }] 
} 

を持っており、現在のコンテキスト内の名前は一意になります。

私の最初の考えだった - このように - タプルのリストにコレクションを変換する:検索

==名前でつぶやくことで

{ 
    (foo)(bar)(buz), 
    (foo)(bar)(buz), 
    (foo)(bar)(buz) 
} 

とフィルタしかし、私は:)する方法を知っている `tを

+2

複数の 'Buz'要素にターゲットの' name'値がある場合はどうなりますか?タプルメンバーのそれぞれに 'オプション'を付ける理由は? 'Option [(Foo、Bar、Buz)]'を持つほうが意味がないでしょうか?タプルのメンバーは、Noneでないものもあります。 – jwvh

+0

にいくつかの説明が追加されました – HoTicE

答えて

1

ここで大きな問題は、あなたが探しているものを見つけるのに十分遠くまで掘り下げた後、その結果のタイプがその種の泥沼を反映することです:Option[List[Option[List...etc

副作用として検索結果を保存する方が簡単です(必ずしも良いとは限りません)。

val bz1 = Buz("bz1", "blah") 
val bz2 = Buz("bz2", "target") 
val bz3 = Buz("bz3", "bliss") 

val br1 = Bar("br1", Option(List(bz1,bz3))) 
val br2 = Bar("br2", None) 
val br3 = Bar("br3", Option(List(bz1,bz2))) 

val fo1 = Foo("fo1", Option(List(br1,br2))) 
val fo2 = Foo("fo2", None) 
val fo3 = Foo("fo3", Option(List(br2,br3))) 

val col: Option[List[Foo]] = Option(List(fo1,fo2,fo3)) 

import collection.mutable.MutableList 
val res:MutableList[(String,String,String)] = MutableList() 

col.foreach(_.foreach(f => 
    f.bars.foreach(_.foreach(br => 
    br.buzzes.foreach(_.collect{ 
     case bz if bz.name == "target" => res.+=((f.id,br.id,bz.id))}))))) 

res // res: MutableList[(String, String, String)] = MutableList((fo3,br3,bz2)) 
関連する問題