没有内置函数或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)
答案 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
}
您可以将其设为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
}
最多只能遍历一次。