23

我有一个清单如下:

val internalIdList: List[Int] = List()

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

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

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

我不能使用a ListBuffer,有义务维护现有的结构。我能怎么做?

谢谢大家

4

7 回答 7

53

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

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

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

深入了解这种方法可以让您做的远不止这些。您可以将列表的任何子列表替换为任意其他子列表。

于 2014-07-21T10:50:38.640 回答
21

只需使用

val trunced = internalIdList.take(index) ++ internalIdList.drop(index + 1)

如果索引大于列表的大小,这也将起作用(它将返回相同的列表)。

于 2013-09-17T10:45:45.557 回答
13

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

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)
于 2013-09-17T11:42:24.417 回答
5

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

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

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

于 2016-03-23T16:43:58.463 回答
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)
于 2013-11-16T10:00:04.033 回答
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) }

虽然这通常会返回一个向量,所以你需要做

val otherList = removeIndex(internalIdList, 3).toList

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

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

于 2013-09-17T14:37:50.610 回答
0

在这样的列表上使用 for 理解xs

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)
于 2016-08-23T18:43:30.107 回答