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

如果你能以某种方式获得项目列表,你可以用 a 做这样的事情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)”,您可能需要一个嵌套的匹配语句:

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

在我的脑海中,不知道该怎么做,但也许 Any 类型的功能之一会有所帮助。

于 2013-10-31T04:49:57.640 回答