List 如何映射列表的索引列表并保留未更改的元素?

List 如何映射列表的索引列表并保留未更改的元素?,list,scala,mapping,List,Scala,Mapping,所以我在Scala中遇到了这个问题,这个问题可能很容易通过循环解决,但我正在尝试为它找到最优雅的解决方案。甚至可能是一行 我有一个子列表的根列表。我需要在子列表的开始处为根列表的每个索引插入一个元素 因此根列表将开始如下所示: List0 element element element List1 element element List2 element element element 在完成函数后,placeA

所以我在Scala中遇到了这个问题,这个问题可能很容易通过循环解决,但我正在尝试为它找到最优雅的解决方案。甚至可能是一行

我有一个子列表的根列表。我需要在子列表的开始处为根列表的每个索引插入一个元素

因此根列表将开始如下所示:

List0
     element
     element
     element
List1
     element
     element
List2
     element
     element
     element
在完成函数后,
placeAtZero(列表(0,2),newElement)
(索引列表,elementToInsert)变成:

List0
     newElement
     element
     element
     element
List1
     element
     element
List2
     newElement
     element
     element
     element
您可以尝试映射一个索引列表,从根列表中获取一个元素,并以这种方式进行预处理。但是,如果您丢失了所有未更改的索引,您将如何以最优雅/高效的方式保存它们

   def placeAtZero(in: List[List[Elem]], indices: Set[Int], elem: Elem) = 
      in.zipWithIndex.collect { 
         case (list, idx) if indices(idx) => elem::list
         case (list, _) => list
       }

编辑根据评论中的建议,可以将
.collect
替换为
.map
。在这种情况下,如果您更喜欢的话。

只需完全按照问题所说的去做,顺便说一句,使用一组索引,因为从建模的角度来看,这将更有效、更有意义:这是我的学习过程,我只是想知道最好的方法是什么,我的大脑立即在每个索引上循环思考,看看它是否是我们想要修改的索引,但这可能是一个较小的解决方案。我建议你总是打开,看看是否有什么可以帮到你,每次你在循环上思考时,也要在地图上思考,nested loop=
flaMap
。我也尝试过,在询问之前我也搜索了很多。但是关于我的新手大脑的文档,我只是不明白它的文档是在解释我需要什么。是的,我并不是说这个问题不好,我只是想指出,FP的优点是你可以写一些字面上的需求,它会起作用(只要你知道该语言提供的一些操作)-习惯Scaladoc中的搜索需要一些时间,祝你好运。@LuisMiguelMejíaSuárez re
.map
vs
.collect
在这种情况下并不重要。re.“如果在体内”:ew!:D@Dima这很重要,因为语义总是保留元素,如果有人进行重构,并且
匹配
变得非穷举,那么编译器将无法捕捉到错误。-关于
if
内部,更少的字符:D@NR这在很大程度上取决于它所说的符号:)也许,你只是忘记了?@LuisMiguelMejíaSuárez是的,但是如果有人在需要进行非穷举重构的地方进行重构,那么
.collect
实际上会更好:)不要试图预测未来的需求-大约100%的时间你都是错的。真正的问题是为什么要进行重构,这会破坏您的语义。重新。“更少的字符”:命名函数
f
将更少的字符。。。如果这是目标的话,还有很多“改进”的空间:)@LuisMiguelMejíaSuárez我们确实关心它,只是以不同的方式:)另外,我还没有意识到,与其他范式相比,函数代码有任何特定的属性可以让它显式地更“可重构”。如果有什么区别的话,我会说它实际上比其他一些方法更不可重构,更重要的是,不需要重构或可重构。至于遵循干净的代码指导原则,对于创建和维护代码的人来说,这是一个问题,对于更改代码的人来说也是一个问题(碰巧我的同事也是同一个人)。