16

私は最近Scalaで初心者向けのプロジェクトに取り組んでおり、Scalaのリストについて初心者向けの質問があります。

タプルのリストがあるとします(List[Tuple2[String, String]]たとえば)。リストから指定されたタプルの最初の出現を返す便利な方法はありますか、それとも手動でリストを反復処理する必要がありますか?

4

7 に答える 7

13
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))
于 2008-09-14T17:37:53.833 に答える
6

findを使用してみてください。(検索のscala-docの場所を更新)

于 2008-09-10T14:07:35.930 に答える
3

前のコメントで述べたように、findおそらくこれを行う最も簡単な方法です。Scala のコレクションには、実際には 3 つの異なる「線形検索」メソッドがあり、それぞれがわずかに異なる値を返します。どちらを使用するかは、データが必要な目的によって異なります。たとえば、インデックスが必要ですか、それともブール値true/だけが必要falseですか?

于 2008-09-15T20:14:47.927 に答える
2

scala を学んでいるなら、 Seqトレイトをよく見てみましょう。これは、scala の優れた機能の多くの基礎を提供します。

于 2008-09-11T13:34:55.003 に答える
1

これがあなたを助けるかもしれないコードです。

同様のケースがあり、基本クラス エントリ (ここでは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、何も見つからない場合は例外をスローするように動作を簡単に変更できます。お役に立てれば。

于 2012-11-09T10:00:40.037 に答える
1

たとえば、次のように、どちらが最初に一致するタプル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

于 2015-09-27T21:08:00.367 に答える
1

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)
于 2008-12-24T23:42:21.227 に答える