Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.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 有明确的大小和知识_Scala_Scala Collections - Fatal编程技术网

Scala 有明确的大小和知识

Scala 有明确的大小和知识,scala,scala-collections,Scala,Scala Collections,我正在浏览Scala中的列表方法 val mylist = List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 3, 10) 我被hasDefiniteSize和knownSize弄糊涂了 对于List,hasDefiniteSize返回true,knownSize返回-1 这些方法背后的确切理论是什么?此方法由列表的超类定义,该超类与可能无限的集合(如流s、懒散列表s和迭代器s)相同 关于更多细节,我相信文档中的描述是最好的 这是一个用于: 测试是否已知此集合的大小有限。

我正在浏览Scala中的
列表
方法

val mylist = List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 3, 10)
我被
hasDefiniteSize
knownSize
弄糊涂了

对于
List
hasDefiniteSize
返回
true
knownSize
返回
-1


这些方法背后的确切理论是什么?

此方法由
列表
的超类定义,该超类与可能无限的集合(如
s、
懒散列表
s和
迭代器
s)相同

关于更多细节,我相信文档中的描述是最好的

这是一个用于:

测试是否已知此集合的大小有限。全部的 严格集合的大小是有限的。对于非严格的 集合(如Stream),如果所有元素 已经计算过了。如果流还没有打开,则返回false 评估到底。非空迭代器通常返回false,即使 它们是从已知有限大小的集合中创建的

注意:许多收集方法在无限长的集合上不起作用 尺寸。典型的故障模式是无限循环。这些方法 始终在不首先检查hasDefiniteSize的情况下尝试遍历 返回true。但是,检查hasDefiniteSize可以提供 保证尺寸定义明确,不终止不是一个问题 担心

请注意,
hasDefiniteSize
已被弃用,并显示以下消息:

(自2.13.0版起)检查.knownSize而不是.hasDefiniteSize 有关更多可操作的信息(有关详细信息,请参阅scaladoc)

进一步声明:

此集合中的元素数(如果可以便宜地使用) 计算得出,否则为-1。便宜通常意味着:不需要 集合遍历


List
是链表的实现,这就是为什么
List(1,2,3)返回
true
(集合不是无限的),而是
List(1,2,3)。knownSize
返回
-1
(计算集合大小需要遍历整个列表).

有些收藏知道它们的大小

Vector(1,2,3).knownSize   // 3
有些则不然

List(1,2,3).knownSize     // -1

如果一个集合知道它的大小,那么可以优化一些操作,例如,考虑如何使用<代码> NoNeSige以尽早返回

  def sizeCompare(that: Iterable[_]): Int = {
    val thatKnownSize = that.knownSize

    if (thatKnownSize >= 0) this sizeCompare thatKnownSize
    else {
      val thisKnownSize = this.knownSize

      if (thisKnownSize >= 0) {
        val res = that sizeCompare thisKnownSize
        // can't just invert the result, because `-Int.MinValue == Int.MinValue`
        if (res == Int.MinValue) 1 else -res
      } else {
        val thisIt = this.iterator
        val thatIt = that.iterator
        while (thisIt.hasNext && thatIt.hasNext) {
          thisIt.next()
          thatIt.next()
        }
        java.lang.Boolean.compare(thisIt.hasNext, thatIt.hasNext)
      }
    }
  }

请参见相关问题

,了解什么样的列表?你能提供一个例子吗?val mylist=List(1,2,3,4,5,6,7,8,9,10,3,10)