在列表的指定位置插入新元素

时间:2015-06-24 21:28:36

标签: scala

没有内置函数或List方法允许用户在List的某个位置添加新元素。我已经编写了一个可以做到这一点的功能,但我不确定以这种方式做到这一点是个好主意,即使它运行得非常好:

def insert(list: List[Any], i: Int, value: Any) = {
  list.take(i) ++ List(value) ++ list.drop(i)
}

用法:

scala> insert(List(1,2,3,5), 3, 4)
res62: List[Any] = List(1, 2, 3, 4, 5)

3 个答案:

答案 0 :(得分:33)

类型安全

我看到的最明显的是缺少类型安全/丢失类型信息。我会在列表的元素类型中使该方法通用:

def insert[T](list: List[T], i: Int, value: T) = {
  list.take(i) ++ List(value) ++ list.drop(i)
}

风格

如果正文只包含一个表达式,则不需要大括号:

def insert[T](list: List[T], i: Int, value: T) = 
  list.take(i) ++ List(value) ++ list.drop(i)

效率

@Marth关于使用List.splitAt避免遍历列表两次的评论也很好:

def insert[T](list: List[T], i: Int, value: T) = {
  val (front, back) = list.splitAt(i)
  front ++ List(value) ++ back
}

接口

一次插入多个值可能很方便:

def insert[T](list: List[T], i: Int, values: T*) = {
  val (front, back) = list.splitAt(i)
  front ++ values ++ back
}

界面,取2

您可以将其设为List

的扩展方法
implicit class ListWithInsert[T](val list: List[T]) extends AnyVal {
  def insert(i: Int, values: T*) = {
    val (front, back) = list.splitAt(i)
    front ++ values ++ back
  }
}

List(1, 2, 3, 6).insert(3, 4, 5)
// => List(1, 2, 3, 4, 5, 6)

结束语

但请注意,插入列表中间并不适合使用缺点列表。使用(可变)链表或动态数组,你会好得多。

答案 1 :(得分:22)

您还可以使用xs.patch(i, ys, r),使用r替换补丁xs的{​​{1}} i ys元素。并使r=0成为单身人士:

ys

答案 2 :(得分:0)

the Scala course by his eminence Martin Odersky himself, he implements it similarly to

def insert(list: List[Any], i: Int, value: Any): List[Any] = list match {
  case head :: tail if i > 0 => head :: insert(tail, i-1, value)
  case _ => value :: list
}

最多只能遍历一次。