【发布时间】:2013-10-22 21:05:52
【问题描述】:
给定以下 Scala 2.9.2 代码:
更新为无效示例
import collection.immutable.SortedSet
case class Bar(s: String)
trait Foo {
val stuff: SortedSet[String]
def makeBars(bs: Map[String, String])
= stuff.map(k => Bar(bs.getOrElse(k, "-"))).toList
}
case class Bazz(rawStuff: List[String]) extends Foo {
val stuff = SortedSet(rawStuff: _*)
}
// test it out....
val b = Bazz(List("A","B","C"))
b.makeBars(Map("A"->"1","B"->"2","C"->"3"))
// List[Bar] = List(Bar(1), Bar(2), Bar(3))
// Looks good?
// Make a really big list not in order. This is why we pass it to a SortedSet...
val data = Stream.continually(util.Random.shuffle(List("A","B","C","D","E","F"))).take(100).toList
val b2 = Bazz(data.flatten)
// And how about a sparse map...?
val bs = util.Random.shuffle(Map("A" -> "1", "B" -> "2", "E" -> "5").toList).toMap
b2.makeBars(bs)
// res24: List[Bar] = List(Bar(1), Bar(2), Bar(-), Bar(5))
我发现,在某些情况下,扩展 Foo 的类的 makeBars 方法确实不返回排序列表。事实上,列表排序确实不反映了SortedSet的排序
我在上面的代码中遗漏了什么,Scala 并不总是将 SortedSet 映射到 List,其中元素按 SortedSet 排序?
【问题讨论】:
-
你需要展示一个实际不起作用的例子。
-
同意。这需要一些时间,因为我必须清理一些专有代码。
-
已更新。我遗漏了他的 map 函数实际上是将
stuffSortedSet 的元素包装在案例类“Bar”中 -
再次更新,这次展示了
makeBars函数中的更多缺陷。
标签: scala