删除给定索引处的元素

Remove element at given index

在 Scala 中,我有一个名为 elemArray[Int] 对象。

我想删除索引 k 处的元素。

我试过这个:

elem.filter(! _.equals(elem(k)))

但是,这会删除所有等于 elem(k) 的元素。

如何只删除索引 k 处的元素?

elem.zipWithIndex.filter(_._1 != k).map(_._2)

如果你有 Array("a", "b", "c") 然后 zipWithIndex - 转换为 Array((0, "a"), (1, "b"), (2, "c"))

对于所有集合(您可以这样查看 Array),您可以使用 returns 新集合的不可变 patch 方法:

val xs = Seq(6, 5, 4, 3)
// replace one element at index 2 by an empty seq:
xs.patch(2, Nil, 1)  // List(6, 5, 3)

如果您想要一个可变集合,您可能需要查看 Buffer 而不是 Array

val ys = collection.mutable.Buffer(6, 5, 4, 3)
ys.remove(2)
ys // ArrayBuffer(6, 5, 3)

实现此目的的一种补充方法是围绕索引取舍:

val filteredElem = elem.take(k) ++ elem.drop(k+1)

使用splitAt如下,

val (l,r) = xs.splitAt(k)
l ++ r.drop(1)

同样与使用zipWithIndex类似的方式,我们生成索引范围并过滤掉具有值k的索引,然后我们可以提取其余部分,像这样,

(0 until xs.size).filter(_ != k).map(xs)

正在使用 collect

 (0 until xs.size).collect {
   case x if x != k => xs(x)
 }

使用 a 进行理解,

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

一种更通用的形式,其中我们有一组要排除的索引,即

val exclude = Set(k,k+3)
for (i <- 0 until xs.size if !exclude(i)) yield xs(i)

我们映射索引不在 exclude