如何从仅具有索引的Scala中的列表中删除项?

YoB*_*Bre 17 scala list filter scala-2.10

我有一个列表如下:

val internalIdList: List[Int] = List()

internalIdList = List(11, 12, 13, 14, 15)
Run Code Online (Sandbox Code Playgroud)

从此列表中删除第三个元素以获取:

internalIdList = List(11, 12, 14, 15)
Run Code Online (Sandbox Code Playgroud)

我不能使用ListBuffer,有义务维持现有的结构.我能怎么做?

谢谢大家

Rok*_*alj 46

有一个.patch方法Seq,所以为了删除第三个元素你可以简单地这样做:

List(11, 12, 13, 14, 15).patch(2, Nil, 1)
Run Code Online (Sandbox Code Playgroud)

其中说:从索引2开始,请删除1个元素,并将其替换为Nil.

深入了解这种方法使您能够做到这一点.您可以使用任意其他列表替换列表的任何子列表.

  • 我喜欢它!是的,我确实想“修补”列表,而不是仅仅从中删除一个元素。所以我来寻找错误问题的答案,感谢您仍然找到了我的问题的解决方案。 (3认同)

Sha*_*nds 17

如果你知道你将丢弃第三个元素(索引2),那么你可以简单地使用

val trunced = internalIdList.take(index) ++ internalIdList.drop(index + 1)
Run Code Online (Sandbox Code Playgroud)

否则,如果不事先知道该指数将要删除的元素是什么,你可以写类似以下的功能:

val trunced = internalIdList.take(index) ++ internalIdList.drop(index + 1)
Run Code Online (Sandbox Code Playgroud)

  • if / else没用:如果给定索引大于大小,则取入和取走行为将符合预期。 (2认同)

Nic*_*las 10

一种惯用的方法是使用索引压缩值,过滤,然后再次投影值:

scala> List(11,12,13,14,15).zipWithIndex.filter(_._2 != 2).map(_._1)
res0: List[Int] = List(11, 12, 14, 15)
Run Code Online (Sandbox Code Playgroud)

但你也可以使用splitAt:

scala> val (x,y) = List(11,12,13,14,15).splitAt(2)
x: List[Int] = List(11, 12)
y: List[Int] = List(13, 14, 15)

scala> x ++ y.tail
res5: List[Int] = List(11, 12, 14, 15)
Run Code Online (Sandbox Code Playgroud)


Rok*_*alj 5

如果您坚持使用老式方法,请使用收集:

List(1,2,3,4).zipWithIndex.collect { case (a, i) if i != 2 => a }
Run Code Online (Sandbox Code Playgroud)

不过,我还是更喜欢我另一个答案中的方法。