Scala:如何将列表的一部分复制到另一个列表

Scala:如何将列表的一部分复制到另一个列表,scala,Scala,我是斯卡拉的新手 我有一张单子 origList=包含数千个元素的列表[Double]。 我需要创建另一个列表 大纲视图=列表[双精度] 并将origList中的元素和索引复制到它 开始,开始+1,…,开始+nCopy-1 也就是说,输出列表将包含nCopy元素 这部分代码将执行多次。在Scala中最有效的方法是什么?人们通常在Scala中使用的方法是list.slice(start,start+nCopy) 注意,scala中的List与java中的ArrayList不同,它不是一个随机访问容

我是斯卡拉的新手

我有一张单子 origList=包含数千个元素的列表[Double]。 我需要创建另一个列表 大纲视图=列表[双精度] 并将origList中的元素和索引复制到它 开始,开始+1,…,开始+nCopy-1 也就是说,输出列表将包含nCopy元素


这部分代码将执行多次。在Scala中最有效的方法是什么?

人们通常在Scala中使用的方法是
list.slice(start,start+nCopy)

注意,scala中的
List
与java中的
ArrayList
不同,它不是一个随机访问容器。它是作为一个链表来实现的,因此,特别是,如果您要多次这样做,那么如果您将列表转换为事先编制索引的内容,它将非常有帮助:
val converted=list.toIndexedSeq
或者更好的是,
val converted=list.toArray

数组
索引eq
上的
切片
效率会更高,尤其是在
开始
索引较高的情况下

现在,如果您真的关心这一操作的效率,那么(不幸的是)没有什么能比得上好的旧java方法:

val converted = list.toArray
val copied = java.util.Arrays.copyOfRange(converted, start, start+nCopy)

复制足够多(数百)个元素时,这可能比转换的.slice(别管
list.slice
)快几个数量级。

您正在寻找
slice
<代码>列表可能也不是最好的数据结构。请注意为什么
java.util.array.copyOfRange
转换的#slice
要“快几个数量级”?最后,看看
数组#copyOfRange
的文档(),一个风险似乎是:
一个新数组包含原始数组的指定范围,截断或填充null以获得所需的长度
更快,因为它的实现(非常)不同,使用本机代码一次复制一个连续的内存块,而不是像scala实现那样逐个移动元素。如果“为什么”的意思是“为什么它的实现方式与java不同”,我不知道。您必须询问编写scala实现的人。我猜这更容易。至于“风险”部分,我不知道你的意思。谢谢你的解释,@Dima。所谓“风险”,我只是指
java.util.Arrays.copyOfRange(数组(1,2,3),0,5)
=
数组(1,2,3,0,0)
。我天真的假设是,上面的值等于
数组(1,2,3)
,即
null
。我认为在使用方法时“阅读文档”是一项假设任务,但我并不天真地期望填充的
null
。@KevinMeredith做出“天真假设”总是有风险的,不管最终使用哪种具体实现;)-1.关于数量级较慢的部分是错误的。我在长度为10000的
列表上测试。当复制5000到6000个元素时,简单的
列表.slice
数组.copyOfRange
快两倍。将元素1000复制到9000时
List.slice
的速度要慢两倍。我认为
Array.copyOfRange
中最慢的部分是从一开始就将整个
列表
复制到
Array
。如果从一开始就有一个
数组,则
切片
变慢是正确的。