私は最近Scalaで初心者向けのプロジェクトに取り組んでおり、Scalaのリストについて初心者向けの質問があります。
タプルのリストがあるとします(List[Tuple2[String, String]]
たとえば)。リストから指定されたタプルの最初の出現を返す便利な方法はありますか、それとも手動でリストを反復処理する必要がありますか?
scala> val list = List(("A", "B", 1), ("C", "D", 1), ("E", "F", 1), ("C", "D "、2)、("G"、"H"、1)) リスト: List[(java.lang.String, java.lang.String, Int)] = List((A,B,1), (C,D,1), (E,F,1), (C, D,2), (G,H,1)) scala> list find {e => e._1 == "C" && e._2 == "D"} res0: オプション[(java.lang.String, java.lang.String, Int)] = Some((C,D,1))
findを使用してみてください。(検索のscala-docの場所を更新)
前のコメントで述べたように、find
おそらくこれを行う最も簡単な方法です。Scala のコレクションには、実際には 3 つの異なる「線形検索」メソッドがあり、それぞれがわずかに異なる値を返します。どちらを使用するかは、データが必要な目的によって異なります。たとえば、インデックスが必要ですか、それともブール値true
/だけが必要false
ですか?
scala を学んでいるなら、 Seqトレイトをよく見てみましょう。これは、scala の優れた機能の多くの基礎を提供します。
これがあなたを助けるかもしれないコードです。
同様のケースがあり、基本クラス エントリ (ここではA
) のコレクションがあり、そこから特定の派生クラスのノード (ここでは ) を見つけたいと考えていましたB
。
class A
case class B(val name: String) extends A
object TestX extends App {
val states: List[A] = List( B("aa"), new A, B("ccc") )
def findByName( name: String ): Option[B] = {
states.find{
case x: B if x.name == name => return Some(x)
case _ => false
}
None
}
println( findByName("ccc") ) // "Some(B(ccc))"
}
ここで(私のアプリにとって)重要な部分は、findByName
戻りませんOption[A]
がOption[B]
.
代わりに戻りB
、何も見つからない場合は例外をスローするように動作を簡単に変更できます。お役に立てれば。
たとえば、次のように、どちらが最初に一致するタプルcollectFirst
を配信するか、またはそうでないかを検討します。Some[(String,String)]
None
xs collectFirst { case t@(a,_) if a == "existing" => t }
Some((existing,str))
scala> xs collectFirst { case t@(a,_) if a == "nonExisting" => t }
None
を使用して、一致するタプル全体を収集できるよう@
に、タプルの値をバインドします。t
Tuple2 クラスのフィールド名を知る必要がなく、代わりにパターン マッチングを使用することもできます。
list find { case (x,y,_) => x == "C" && y == "D" }
「検索」は、必要なものが 1 つだけであることがわかっている場合に適しています。一致するすべての要素を見つけたい場合は、「フィルター」または同等のシュガーを使用して理解することができます。
for ( (x,y,z) <- list if x == "C" && y == "D") yield (x,y,z)