代码之家  ›  专栏  ›  技术社区  ›  aioobe

什么时候在scala中一个集比另一个集少?

  •  4
  • aioobe  · 技术社区  · 15 年前

    我想比较scala中两个集合的基数。因为有些东西在scala中有时“只是起作用”,所以我尝试使用 < 两组之间。这似乎已经过去了,但我对结果一无所知。

    例子:

    scala> Set(1,2,3) < Set(1,4)
    res20: Boolean = true
    
    • 它会返回什么?
    • 在哪里可以阅读API中有关此方法的信息?
    • 为什么它不列在 scala.collection.immutable.Set ?

    更新:甚至 秩序 ??)集合中的元素似乎很重要:

    scala> Set(2,3,1) < Set(1,3)
    res24: Boolean = false
    
    scala> Set(1,2,3) < Set(1,3)
    res25: Boolean = true
    
    3 回复  |  直到 15 年前
        1
  •  5
  •   Daniel C. Sobral    15 年前

    这不适用于2.8。在scala 2.7中,发生的情况是:

    scala.Predef.iterable2ordered(Set(1, 2, 3): Iterable[Int]) < (Set(1, 3, 2): Iterable[Int])
    

    换句话说,在 scala.Predef ,对于所有scala代码,从 Iterable[A] Ordered[Iterable[A]] ,前提是 A => Ordered[A] 可用。

    考虑到集合的不可数的次序是不确定的,你不能真正预测它。例如,如果添加元素使集合大小大于4,则会得到完全不同的结果。

        2
  •  2
  •   Randall Schulz    15 年前

    如果要比较基数,只需直接进行比较:

    scala> Set(1, 2, 3).size < Set(2, 3, 4, 5).size
    res0: Boolean = true
    
        3
  •  0
  •   Diego Sevilla    15 年前

    我对scala的了解不多,但是做了一些测试,我得到了以下信息:

    scala> Set(1,2) <
    <console>:5: error: missing arguments for method < in trait Ordered;
    follow this method with `_' if you want to treat it as a partially applied function
       Set(1,2) <
                ^
    

    这告诉我 < 来自于特性 Ordered . 更多提示:

    scala> Set(1,2) < _
    res4: (Iterable[Int]) => Boolean = <function>
    

    也就是说, Set 被评估为 Iterable ,因为可能有一些隐式转换,从iterable[a]到ordered[iterable[a]],但我不确定…测试不一致。例如,这两个词可能暗示了一种词典编纂比较:

    scala> Set(1,2,3) < Set(1,2,4)
    res5: Boolean = true
    

    1等于,2等于,3小于4。

    scala> Set(1,2,4) < Set(1,2,3)
    res6: Boolean = false
    

    但这些不是:

    scala> Set(2,1) < Set(2,4)
    res11: Boolean = true
    
    scala> Set(2,1) < Set(2,2)
    res12: Boolean = false
    

    我认为正确的答案是 命令 特性正确:没有实现 < 两个集合之间的差异大于它们的哈希代码的比较:

    有序[A]实例的hashcode方法必须与compare方法一致,这一点很重要。但是,不可能提供合理的默认实现。因此,如果您需要能够计算有序[A]实例的散列值,那么您必须在接收或实例化时自己提供散列值。

    推荐文章