加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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]]

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读