相关疑难解决方法(0)

Scala:我可以依赖Set中的项目顺序吗?

这是一个非常不可思议的惊喜:

scala> Set(1, 2, 3, 4, 5)       
res18: scala.collection.immutable.Set[Int] = Set(4, 5, 1, 2, 3)
scala> Set(1, 2, 3, 4, 5).toList
res25: List[Int] = List(5, 1, 2, 3, 4)
Run Code Online (Sandbox Code Playgroud)

这个例子本身就表明了我的问题的"不"答案.那怎么样ListSet

scala> import scala.collection.immutable.ListSet
scala> ListSet(1, 2, 3, 4, 5)
res21: scala.collection.immutable.ListSet[Int] = Set(1, 2, 3, 4, 5)
Run Code Online (Sandbox Code Playgroud)

这个似乎工作,但我应该依靠这种行为?还有哪些其他数据结构适用于必须保留原始订单的唯一项目的不可变集合?

顺便说一下,我确实知道distict方法List.问题是,我想在接口级强制执行项目的唯一性(同时保留顺序),因此使用distinct会弄乱我的整洁设计.

编辑

ListSet 看起来也不太可靠:

scala> ListSet(1, 2, 3, 4, 5).toList
res28: List[Int] = List(5, 4, 3, 2, 1)
Run Code Online (Sandbox Code Playgroud)

EDIT2

在我寻找完美设计时,我试过这个:

scala> class MyList[A](list: List[A]) …
Run Code Online (Sandbox Code Playgroud)

scala set

30
推荐指数
3
解决办法
2万
查看次数

"Brodal搜索树"真的已经实用了吗?

Brodal等.在他们的ESA '06论文中证明了存在一个纯函数结构,具有对数时间搜索,更新和插入以及恒定时间合并.(注意我不是在谈论Brodal堆,它是一种不同的数据结构,广泛用于实现纯粹的功能优先级队列.)这似乎是一个非常有利可图的结果,应该导致高效的纯功能集和映射,但我没有看到他们在任何地方使用过:

  • Haskell containers使用亚当斯树;
  • OCaml标准库使用AVL树;
  • Scala的不可变排序映射使用红黑树实现.

如果Brodal树真的有这么好的结果,为什么它们没有被改编成主流的函数式编程语言标准库?事实上,我根本没有看到一个Brodal树的实现!

具体来说,这是因为:

  • 它们非常难(或实际上几乎不可能)正确实施;
  • 常数非常大,实际收益似乎很小;
  • 其他原因;
  • 或上述的组合?

ocaml haskell functional-programming scala data-structures

19
推荐指数
1
解决办法
316
查看次数

Scala中'HashSet'和'Set'之间的区别?

我对Scala HashSetSet类型很困惑,因为它们似乎都做同样的事情.

  • 他们之间有什么区别?
  • 它在Java中是一样的吗?
  • 在我的参考文献中,它表示这HashSet是一个"显式集合类"(与之相比Set).那是什么意思?

scala set hashset

18
推荐指数
1
解决办法
6560
查看次数