gpt4 book ai didi

scala 集合 : map a list and carry some state?

转载 作者:行者123 更新时间:2023-12-01 09:40:00 26 4
gpt4 key购买 nike

我似乎一直都遇到这个问题。我想修改列表中的一些元素,但我需要在修改时保持一些状态,所以 map 不起作用。

这是一个例子:

scala> val l1 = List("a","b","c","d","e","f","b","c","e","b","a")
l1: List[String] = List(a, b, c, d, e, f, b, c, e, b, a)

我想更改任何重复项的名称。所以我想结束这个:

List(a1, b1, c1, d, e1, f, b2, c2, e2, b3, a2)

上当很容易:

scala> val d = l1.diff(l1.distinct).distinct
d: List[String] = List(b, c, e, a)

现在我卡住了。我通过将 d 转换为带计数的 HashMap 并编写一个函数来迭代 l1 并在递归之前更新它和哈希来使其工作。效果很好,但对我来说有点难看。

但我一直认为应该有一种方法可以使用集合类。

这是我不喜欢的其余解决方案:

  val m = d.map( _ -> 1).toMap

def makeIt(ms: Map[String, Int], ol: Iterator[String], res: List[String]=List[String]()) :List[String] = {
if( !ol.hasNext) return res
val no = ol.next()
val (p,nm) = ms.get(no) match {
case Some(v) => (s"$no$v", ms.updated(no,v+1))
case None => (no,ms)
}

makeIt(nm,ol,res :+ p)
}

makeIt(m,l1.iterator)

这给了我想要的东西

res2: List[String] = List(a1, b1, c1, d, e1, f, b2, c2, e2, b3, a2)

我觉得我想要“mapWithState”,在那里我可以传递一些东西。像折叠一样。也许它存在,只是我还没有找到它?

谢谢

--------更新------------

@Aluan Haddad 的评论为我指明了这个方向。这破坏了秩序,这对我来说很好。但是“状态”是由 zipWithIndex 携带的。我正在寻找一个更一般的情况,其中状态需要在每个元素上进行一些计算。但对于这个简单的案例,我喜欢它:

l1.groupBy(x=>x).values.flatMap( v =>{
if( v.length <= 1 ) v else {
v.zipWithIndex.map{ case (s,i) => s"$s${i+1}"}
}
})
res7: Iterable[String] = List(e1, e2, f, a1, a2, b1, b2, b3, c1, c2, d)

最佳答案

棘手的部分是 "d""f" 元素没有得到修改。

这是我想出来的。它更简洁,代码更明智,但确实涉及多次遍历。

val l1: List[String] = List("a","b","c","d","e","f","b","c","e","b","a")

l1.reverse.tails.foldLeft(List[String]()){
case (res, Nil) => res
case (res, hd::tl) =>
val count = tl.count(_ == hd)
if (count > 0) s"$hd${count+1}" +: res
else if (res.contains(hd+2)) (hd+1) +: res
else hd +: res
}
//res0: List[String] = List(a1, b1, c1, d, e1, f, b2, c2, e2, b3, a2)

通过使用 tails,每个元素 hd 都能够看到 future tl 和过去 res

关于scala 集合 : map a list and carry some state?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49714730/

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