0

次のような文字列オブジェクトから有用なフィールドを抽出したい

Request(Some(8454439),Some(16872692),Some(0.0.0.0),Some(8281008),Some(ArrayBuffer(845434399)),Some(129032),Some(3),Some(Profile),Some(en),None,None,None,None,Some(true),None,Some(Food),None,Some(Fish))

合計で 18 のフィールドがあり、私がやりたいのは、それらを 18 の異なる文字列に割り当て、それが である場合は有用な情報を抽出しSome(X)、それ以外の場合は文字列を に設定することNoneです。

たとえば、この場合、応答の文字列配列は次のようになります。

val results = Array("8454439", "16872692", "0.0.0.0", "8281008", "ArrayBuffer(845434399)",
"129032", "3", "Profile", "en", "None", "None", "None", "None", "true", "None",
"Food", "None", "Fish")
4

2 に答える 2

1

何らかの方法でアイテムのリストを取得できる場合は、次のように を使用できますSeq[Option[Any]]

val items: Seq[Option[Any]] = ???
items.map(_.getOrElse("None").toString)

しかし、の出力しかない場合はRequest.toString、これでほとんどの方法が得られます。

val s = "Request(Some(8454439),Some(16872692),Some(0.0.0.0),Some(8281008),Some(ArrayBuffer(845434399)),Some(129032),Some(3),Some(Profile),Some(en),None,None,None,None,Some(true),None,Some(Food),None,Some(Fish))"
val pat1 = """Some\([\w.()]+?\)|None""".r
val pat2 = """Some\((.*)\)""".r
pat1.findAllIn(s).map {
  case pat2(some) => some
  case x => x
}.toList
// res0: List[String] = List(8454439, 16872692, 0.0.0.0, 8281008, ArrayBuffer(845434399, 129032, 3, Profile, en, None, None, None, None, true, None, Food, None, Fish)

私の regex-fu は、末尾の括弧を値に保持するほど強力ではありませんArrayBufferが、それ以外の場合はうまくいくようです。

于 2013-10-31T01:38:13.800 に答える
0

あなたはの線に沿って何かを試しましたか

val items = request.map {
    case Some(value) => value
    case None => "None"
}

ただし、実際に Some(ArrayBuffer(845434399)) を "ArrayBuffer(845434399)" に変換するには、ネストされた match ステートメントが必要になる場合があります。

val items = request.map {
    case Some(value) => value match {
                            case strng: String => strng
                            case other => ???
                        }
    case None => "None"
}

頭のてっぺんから、それを行うために何を呼び出すべきかわかりませんが、おそらく Any 型の関数の1つが役立つでしょう。

于 2013-10-31T04:49:57.640 に答える