在Scala中将元素从一个列表复制到另一个列表

Pau*_*aul 4 scala copy list

我想在Scala中创建通用(不变)方法,该方法将元素从源列表复制到目标列表.在Java中,java.util.Collections中copy方法(参见http://docs.oracle.com/javase/1.4.2/docs/api/java/util/Collections.html#copy%28java.util.List, %20java.util.List%29).我知道在Scala List中是不可变对象所以我想创建并返回新列表.

我写了以下代码:

def copy[T](dest:List[T], src:List[T]):List[T] = {
    if(dest.length<src.length) throw new Exception("IndexOutOfBoundsException")
    else if(src==Nil) dest
    else {
        var ret = dest
        ret = dest.updated(0, src.first)
        var i=1
        val f:(T=>Unit) = a => {
            if(i<src.length) ret=ret.updated(i, src(i))
            i+=1
            ()
        }
        dest.foreach(f)
        ret
    } 
}
Run Code Online (Sandbox Code Playgroud)

但我认为它可以写得更好.你能帮我写出更好的代码吗?提前致谢.

编辑:也许我表达不清楚我想做什么.我有两个列表(scala.collection.immutable.List),例如src(length = x)和dest(length = y> = x).我想用src列表中的元素替换dest列表的前x个元素.

sen*_*nia 8

你的意思是scala.collection.immutable.List?这是不可改变的.无需复制它们.不可变意味着什么都不能改变它,所以你可以在不同的线程中使用它.

在scala中创建集合的一般方法是构建器.你可以从CanBuildFrom对象中获得一个.或者,您可以从genericBuilder集合实例的方法中获取它.

scala> val list = List(1, 2, 3)
list: List[Int] = List(1, 2, 3)

scala> val b = list.genericBuilder[Int]
b: scala.collection.mutable.Builder[Int,List[Int]] = ListBuffer()

scala> list.foreach{ b += _ }

scala> val result = b.result // this code is useless. `val result = list` is enough
result: List[Int] = List(1, 2, 3)
Run Code Online (Sandbox Code Playgroud)

如果要根据现有集合创建不同类型的新集合,可以使用这样的collection.breakOutmethid:

scala> val list = List('a', 'b', 'c')
list: List[Char] = List(a, b, c)

scala> val result: String = list.map{identity}(collection.breakOut)
result: String = abc
Run Code Online (Sandbox Code Playgroud)

UPD

require(src.length <= dest.length, "IndexOutOfBoundsException")
src ++ dest.drop(src.length)
Run Code Online (Sandbox Code Playgroud)