List scala-获取列表的只读子列表视图

List scala-获取列表的只读子列表视图,list,scala,iterator,List,Scala,Iterator,我想要一个列表,Seq,甚至是一个可编辑的,它是列表一部分的只读视图,在我的特定情况下,视图总是从第一个元素开始 List.slice,是O(n),与过滤器一样。还有比这更好的方法吗?我不需要像+,-等任何操作。只要应用,映射,平面映射,等等,就可以在子列表上提供列表理解语法 写我自己的类的答案是什么?它的迭代器保持计数以知道结束在哪里?流呢?溪流是斯卡拉的懒惰之路。由于Stream的惰性,Stream.take()在本例中就是您需要的,它是O(1)。唯一需要注意的是,如果在对流执行列表理解之后

我想要一个
列表
Seq
,甚至是一个
可编辑的
,它是列表一部分的只读视图,在我的特定情况下,视图总是从第一个元素开始

List.slice
,是O(n),与
过滤器一样
。还有比这更好的方法吗?我不需要像
+
-
等任何操作。只要
应用
映射
平面映射
,等等,就可以在子列表上提供列表理解语法


写我自己的类的答案是什么?它的迭代器保持计数以知道结束在哪里?

流呢?溪流是斯卡拉的懒惰之路。由于Stream的惰性,Stream.take()在本例中就是您需要的,它是O(1)。唯一需要注意的是,如果在对流执行列表理解之后想要返回列表,则需要将其转换回列表。projection为您提供一个流,其中包含列表的大部分操作

scala> val l = List(1, 2, 3, 4, 5)
l: List[Int] = List(1, 2, 3, 4, 5)

scala> val s = l.projection.take(3)
s: Stream[Int] = Stream(1, ?)

scala> s.map(_ * 2).toList
res0: List[Int] = List(2, 4, 6)

scala> (for (i <- s) yield i * 2).toList
res1: List[Int] = List(2, 4, 6)
scala>val l=List(1,2,3,4,5)
l:List[Int]=List(1,2,3,4,5)
scala>vals=l.projection.take(3)
s:流[Int]=流(1,?)
scala>s.map(*2).toList
res0:List[Int]=List(2,4,6)

scala>(对于(iList.slice和List.filter)这两个返回列表,根据定义它们是不可变的。+和-方法返回不同的列表,它们不会更改原始列表。而且,很难比O(N)做得更好。列表不是随机访问,它是一个链表。因此,想象一下,如果您想要的子列表是列表的最后一个元素。访问该元素的唯一方法是迭代整个列表。

好吧,对于
列表上拖放
,您不可能比O(n)更好。至于其他:

def constantSlice[T](l: List[T], start: Int, end: Int): Iterator[T] =
  l.drop(start).elements.take(end - start)
元素
take
(在迭代器上)都是O(1)

当然,
迭代器
不是一个
Iterable
,因为它是不可重用的。在Scala 2.8上,首选返回
Iterable
,而不是
迭代器
。如果您需要在Scala 2.7上重用,那么
可能是一个不错的选择