从Scala中的String数组中删除第n个元素

时间:2014-01-11 00:47:03

标签: scala

假设我有一个(我假设默认是可变的)Array [String]

如何在Scala中简单地删除第n个元素?

似乎没有简单的方法可供使用。

想要的东西(我做了这个):

def dropEle(n: Int): Array[T]
Selects all elements except the nth one.

n
the subscript of the element to drop from this Array.
Returns an Array consisting of all elements of this Array except the 
nth element, or else the complete Array, if this Array has less than 
n elements.

非常感谢。

5 个答案:

答案 0 :(得分:8)

这就是观点的用途。

scala> implicit class Foo[T](as: Array[T]) {
     | def dropping(i: Int) = as.view.take(i) ++ as.view.drop(i+1)
     | }
defined class Foo

scala> (1 to 10 toArray) dropping 3
warning: there were 1 feature warning(s); re-run with -feature for details
res9: scala.collection.SeqView[Int,Array[Int]] = SeqViewSA(...)

scala> .toList
res10: List[Int] = List(1, 2, 3, 5, 6, 7, 8, 9, 10)

答案 1 :(得分:5)

问题在于您选择的半可变集合,因为Array的元素可能会发生变异但其大小无法更改。你真的想要一个已经提供“删除(索引)”方法的缓冲区。

假设您已经拥有一个数组,您可以轻松地将其转换为Buffer或从Buffer转换为执行此操作

def remove(a: Array[String], i: index): Array[String] = {
  val b = a.toBuffer
  b.remove(i)
  b.toArray
} 

答案 2 :(得分:3)

def dropEle [T](n:Int,in:Array [T]):Array [T] = in.take(n - 1)++ in.drop(n)

答案 3 :(得分:1)

大多数集合具有patch方法,可以“滥用”该方法以删除特定索引处的元素:

Array('a', 'b', 'c', 'd', 'e', 'f', 'g').patch(3, Nil, 1)
// Array('a', 'b', 'c', 'e', 'f', 'g')

此:

  • 1元素拖放到索引3

  • 在索引Nil上插入3(空序列)

换句话说,就是“用空序列在索引3上修补1个元素”。


请注意,n是要从集合中删除的项目的从0开始的索引。

答案 4 :(得分:0)

对于引用数组中第一个元素的nth=0

def dropEle[T](nth: Int, in: Array[T]): Array[T] = {
  in.view.zipWithIndex.filter{ e => e._2 != nth }.map{ kv => kv._1 }.toArray
}

稍微紧凑的语法包括

def dropEle[T](nth: Int, in: Array[T]): Array[T] = {
  in.view.zipWithIndex.filter{ _._2 != nth }.map{ _._1 }.toArray
}