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

时间:2013-09-17 10:21:43

标签: list scala filter scala-2.10

我有一个如下列表:

val internalIdList: List[Int] = List()

internalIdList = List(11, 12, 13, 14, 15)

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

internalIdList = List(11, 12, 14, 15)

我不能使用ListBuffer,有义务维持现有的结构。 我该怎么办?

感谢所有

7 个答案:

答案 0 :(得分:44)

.patch上有一个Seq方法,所以为了删除第三个元素,你可以简单地执行此操作:

List(11, 12, 13, 14, 15).patch(2, Nil, 1)

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

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

答案 1 :(得分:14)

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

val trunced = internalIdList.take(2) ++ internalIdList.drop(3)

否则,如果您事先不知道要删除的元素的索引是什么,您可以编写如下函数:

def removeIndex(ix: Int) = if (internalIdList.size < ix) internalIdList
                           else internalIdList.take(ix) ++ internalIdList.drop(ix+1)

答案 2 :(得分:10)

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

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

但您也可以使用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)

答案 3 :(得分:3)

如果您坚持使用oldschool方法,请使用collect:

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

但是,在我的其他答案中,我仍然更喜欢这种方法。

答案 4 :(得分:1)

(internalIdList.indices.collect { case i if i != 3 => internalList(i) }).toList

概括一下......

def removeIndex[A](s: Seq[A], n: Int): Seq[A] = s.indices.collect { case i if i != n => s(i) }

虽然这通常会返回一个Vector,但您需要这样做

val otherList = removeIndex(internalIdList, 3).toList

如果你真的想要一份清单。

Shadowlands有一个解决方案,趋于对线性序列更快。使用索引序列,这个会更快。

答案 5 :(得分:1)

实现Nicolas第一个解决方案的通用函数:

def dropIndex[T](list: List[T], idx: Int): List[T] =
  list.zipWithIndex.filter(_._2 != idx).map(_._1)

用法:

scala> val letters = List('a', 'b', 'c')
scala> for (i <- 0 until letters.length) println(dropIndex(letters, i))
List(b, c)
List(a, c)
List(a, b)

答案 6 :(得分:0)

在列表xs上使用for comprehension,

for (i <- 0 until xs.size if i != nth-1) yield xs(i)

还要考虑一组排除索引,例如val excl = Set(2,4),用于排除第二和第四项;因此我们收集那些索引不属于排除集的项目,即

for (i <- 0 until xs.size if !excl(i)) yield xs(i)