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

标签 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)

最佳答案

类型安全

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

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/

相关文章:

java - Gatling 中的 SSL 签名证书身份验证

scala - 如何用sbt构建一个简单的war文件?

Scala - 转换后撤消平面图

scala - 从数据框中获取按唯一 ID 分组的前 n 条记录

java - jackson 为什么我需要在子类上进行 JsonTypeName 注释

scala - 找不到隐式 json 格式的证据参数的隐式值

scala - 类构造函数声明...声明同一件事的两种方法?

java - Scala 的 loop-react 性能太差了。为什么?

java - 为什么这个 Spark 代码抛出 java.io.NotSerializableException

scala - 拆分 Play ! 2 应用成模块