scala – 函数式编程风格中的过滤器列表
发布时间:2020-12-16 10:07:59 所属栏目:安全 来源:网络整理
导读:我们有一个带有BEGIN和END标记的字符串列表作为此列表的一部分.我们可以在函数式编程风格中过滤出BEGIN-END之间的元素吗?我只是在 scala中使用这种常规(标记)方法出来了. val list1 = """992 1010 1005 1112 BEGIN 1086 1244 1107 1121 END 1223 1312 1319
我们有一个带有BEGIN和END标记的字符串列表作为此列表的一部分.我们可以在函数式编程风格中过滤出BEGIN-END之间的元素吗?我只是在
scala中使用这种常规(标记)方法出来了.
val list1 = """992 1010 1005 1112 BEGIN 1086 1244 1107 1121 END 1223 1312 1319 1306 1469""".lines.toList var flag = false val filteredList = list1.filter{ def f(x: String): Boolean = { if (x.contains("BEGIN")) { flag = true; return false } else if (x.contains("END")) { flag = false } flag } f } 这有可能避免定义标志变量吗?他们如何用纯函数式语言解决这个问题? 解决方法
你可以使用drop / tail,dropWhile,takeWhile函数:
val filteredList = list1.map(_.trim).dropWhile("BEGIN" !=).tail.takeWhile("END" !=) 编辑 正如在注释中提到的,如果列表为空,则tail将抛出异常,因此如果您希望保持安全,请使用drop(1)而不是tail: val filteredList = list1.map(_.trim).dropWhile("BEGIN" !=).drop(1).takeWhile("END" !=) 这是我的算法版本,它处理几个BEGIN和END部分(一些疯狂的东西来自我 – 一个小状态机:) var filteredList1 = list1.map(_.trim).foldLeft(List(None): List[Option[List[String]]]) { case (None :: rest,"BEGIN") => Some(Nil) :: rest case (Some(list) :: rest,"END") => None :: Some(list) :: rest case (Some(current) :: rest,num) => Some(num :: current) :: rest case (result,_) => result }.flatten.reverse map (_.reverse) 它返回List [List [String]] (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |