Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
scala中获取列表上O(1)索引查找的惯用方法_Scala_Scala Collections - Fatal编程技术网

scala中获取列表上O(1)索引查找的惯用方法

scala中获取列表上O(1)索引查找的惯用方法,scala,scala-collections,Scala,Scala Collections,从List.scala的javadoc: Time: List has O(1) prepend and head/tail access. Most other operations are `O(n)` on the number of elements in the list. * **This includes the index-based lookup of elements**, `length`, `append` and `reverse`. 这与java中的Array

从List.scala的javadoc:

 Time: List has O(1) prepend and head/tail access. Most other operations are `O(n)` on the number of elements in the list.
 *  **This includes the index-based lookup of elements**, `length`, `append` and `reverse`.
这与java中的ArrayList相比是不利的。是的,我知道它是可变的,列表不是。。但放弃那场演出是不可能的

那么,在Scala中使用O1实现基于索引的查找(最好是长度)的不可变列表可能/首选的方法是什么呢。可以理解/接受的是,append和reverse处于启用状态

更新Om nom nom提名向量,我同意等待他对此做出真正的回答

从矢量上的javadoc:

Vector是一种通用的、不可变的数据结构。它提供 在有效的固定时间内进行随机访问和更新,以及 非常快速的附加和前置。因为向量有很好的平衡 在快速随机选择和快速随机功能更新之间, 它们目前是不可变索引的默认实现 序列


只需使用数组。这是用于查找的O1

Java中的ArrayList是什么?它只是一个遵循列表契约的数组。如果Java集合是在今天设计的,它们可能会像Scala那样将数组作为类而不是语言特性


因此,在Scala中,我们可以像使用任何其他类型的Seq一样使用数组,例如List或Vector。

只需使用数组即可。这是用于查找的O1

Java中的ArrayList是什么?它只是一个遵循列表契约的数组。如果Java集合是在今天设计的,它们可能会像Scala那样将数组作为类而不是语言特性


因此,在Scala中,我们可以像使用任何其他类型的Seq一样使用数组,例如List或Vector。

对于不可变结构,您可能需要一个Vector;与数组相比,直接访问速度非常慢,但在查找和重复附加或前缀方面接近O1。然而,混合的附加物/前置词使它混淆了

ArrayBuffer是可变的,基本上与java.util.ArrayList的数据结构相同,只是上面有所有Scala集合。地图等等


如果您喜欢列表的堆栈式属性,ArrayStack具有push/pop和索引功能,其中堆栈顶部的元素为0。ArrayStack也是可变的。

对于不可变结构,您可能需要一个向量;与数组相比,直接访问速度非常慢,但在查找和重复附加或前缀方面接近O1。然而,混合的附加物/前置词使它混淆了

ArrayBuffer是可变的,基本上与java.util.ArrayList的数据结构相同,只是上面有所有Scala集合。地图等等


如果您喜欢列表的堆栈式属性,ArrayStack具有push/pop和索引功能,其中堆栈上的顶部元素为0。ArrayStack也是可变的。

Thx。在哪些情况下,您建议使用列表而不是数组?我对使用例如ListBuffer的一个担忧是,Scala非常不鼓励可变性。所以,使用数组作为一种解决方案似乎是不赞成的?JFYI:因为向量查找不是O1,但实际上接近这个值,并且它们从两边都继承了好的特性-快速附加和快速lookups@om-nom nom Vector正是我想要的。请单独回答,我会给你奖励。@om nom nom我继续对你的评论投了更高的票,但给了雷克斯一个类似的答案,但有点扩大了kerr@javadba没关系:-很高兴我帮你找到了正确的方向。在哪些情况下,您建议使用列表而不是数组?我对使用例如ListBuffer的一个担忧是,Scala非常不鼓励可变性。所以,使用数组作为一种解决方案似乎是不赞成的?JFYI:因为向量查找不是O1,但实际上接近这个值,并且它们从两边都继承了好的特性-快速附加和快速lookups@om-nom nom Vector正是我想要的。请单独回答,我会给你奖励。@om nom nom我继续对你的评论投了更高的票,但给了雷克斯一个类似的答案,但有点扩大了kerr@javadba没关系:-很高兴我把你带到了正确的方向嗨,我把这个投了高票。om-nom-nom已经指出这是一个正确的方向——但只是在评论中。所以他有点先到了那里:但他还没有发布一个真正的答案。我不确定谁应该因为这个答案而获奖。@javadba-如果他发帖的话,肯定会把他的答案标记为正确答案。我只是想添加一些关于替代方案的信息,并提供一些关于向量本身的更多信息。我将继续并奖励这个。如果他的答案到了,我会给他投票。@javadba-你可以在以后切换哪个答案是最好的。嗨,我给这个投票了。om-nom-nom已经指出这是一个正确的方向——但只是在评论中。所以他有点先到了那里:但他还没有发布一个真正的答案。我不确定谁应该获得这个奖
回答。@javadba-如果他发帖的话,当然可以将他的答案标记为正确答案。我只是想添加一些关于替代方案的信息,并提供一些关于向量本身的更多信息。我将继续并奖励这个。只要他的答案到了,我就会投票给他。@javadba-你可以在以后切换哪个答案最好。