gpt4 book ai didi

Scala - 使用谓词函数来总结字符串列表

转载 作者:行者123 更新时间:2023-12-04 00:18:35 25 4
gpt4 key购买 nike

我需要编写一个函数来分析一些文本文件。为此,应该有一个函数通过谓词将文件拆分为子列表。它应该只在谓词第一次计算为 True 之后获取值然后在谓词为 True 之后开始一个新的子列表再次。
例如:
List('ignore','these','words','x','this','is','first','x','this','is','second')
带谓词
x=>x.equals('x')
应该生产
List(List('this','is','first'),List('this','is','second'))

我已经将文件读入 List[String]并尝试使用 foldLeft使用 case 语句迭代列表。

words.foldLeft(List[List[String]]()) {
case (Nil, s) => List(List(s))
case (result, "x") => result :+ List()
case (result, s) => result.dropRight(1) :+ (result.last :+ s)
}

虽然这有两个问题,但我无法弄清楚:

  • 这个不忽略第一次谓词之前的词评估为 True
  • 我不能使用任意谓词函数

如果有人能告诉我我必须做些什么来解决我的问题,我们将不胜感激。

最佳答案

我稍微修改了你的例子:

def foldWithPredicate[A](predicate: A => Boolean)(l: List[A]) =
l.foldLeft[List[List[A]]](Nil){
case (acc, e) if predicate(e) => acc :+ Nil //if predicate passed add new list at the end
case (Nil, _) => Nil //empty list means we need to ignore elements
case (xs :+ x, e) => xs :+ (x :+ e) //append an element to the last list
}

val l = List("ignore","these","words","x","this","is","first","x","this","is","second")
val predicate: String => Boolean = _.equals("x")

foldWithPredicate(predicate)(l) // List(List(this, is, first), List(this, is, second))

有一个与您的方法相关的性能问题:appending is very slow on immutable lists .在列表中预先添加元素可能会更快,但是,当然,所有列表的元素都会以相反的顺序排列(但它们可以在末尾颠倒)。

def foldWithPredicate2[A](predicate: A => Boolean)(l: List[A]) =
l.foldLeft[List[List[A]]](Nil){
case (acc, e) if predicate(e) => Nil :: acc
case (Nil, _) => Nil
case (x :: xs, e) => (e :: x) :: xs
}.map(_.reverse).reverse

关于Scala - 使用谓词函数来总结字符串列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62342970/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com