gpt4 book ai didi

scala - 在列表的指定位置插入一个新元素

转载 作者:行者123 更新时间:2023-12-04 02:30:24 26 4
gpt4 key购买 nike

没有内置函数或 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)

最佳答案

类型安全

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

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
}

接口(interface),取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)

结束语

但是请注意,插入到列表中间并不适合 cons 列表。使用(可变)链表或动态数组会更好。

关于scala - 在列表的指定位置插入一个新元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31037384/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com