【问题标题】:Is there a Scala version of NavigableMap?是否有 Scala 版本的 NavigableMap?
【发布时间】:2011-11-05 16:56:03
【问题描述】:

在 Java 1.6 中,引入了 NavigableMap(和 NavigableSet)接口,并更新了 TreeMap 以实现新接口。除其他外,NavigableMap 可用于询问诸如“集合中的哪个元素最接近 X?(有关示例和讨论,请参阅 this excellent blog post by François Sarradin)之类的问题。

我希望在 Scala 2.8 的 TreeMap 实现中找到类似的东西,但可惜似乎并非如此(至少,它并不明显)。是否有另一个类似于 Java 的 NavigableMap 的 Scala 类或特征?如果没有,是否有一些简单的 Scala 习语可以用来实现类似的目标?

我意识到我可以使用 Java 的 TreeMap,但我想留在 Scala 集合框架中(如果只是为了简单)。

【问题讨论】:

    标签: scala collections scala-collections treemap


    【解决方案1】:

    在不可变集合上,具有反向引用使集合无法持久化。因此,人们使用zippers 来浏览这些结构。 Anti-xml 有一个在处理 XML 时使用 zippers 的好例子。

    【讨论】:

    • 很清楚拉链如何帮助修改(复制)树,但不太清楚如何使用拉链来回答诸如“集合中的哪个元素最接近 X?”之类的问题。 .我知道我们在这里讨论的主要是理论(因为拉链似乎主要是实验性的),但你能描述一下拉链如何回答前面提到的问题吗?
    • @Jim Zippers 根本不是实验性的。拉链有两种操作:检查/更新和导航。所以,如果你在 X 处有一个拉链,它的导航操作自然会给你最接近的元素。
    • 啊我明白了!谢谢。你链接到的关于拉链的问题是什么给了我拉链是实验性的印象。很高兴听到它们随时可用。
    • @Jim Zippers 是一种操作数据的方法。对于某些数据结构,可能有现成的 zippers,但您可以编写 zippers 来满足您的任何需求。
    【解决方案2】:

    Here's a thread on this topic

    似乎SortedMap 可能 能够让你部分到达那里,但到目前为止我测试过的东西我不确定它是否是 O(log(n))搜索的方式应该是:

    def searchMap(m: SortedMap[Int,_], k: Int) = {
        val left  = m to(k) lastKey
        val right = m from(k) take(2) lastKey
    
        if (k - left < right - k)
            left
        else
            right
    }
    

    根据fromtorangeImpl 方面的定义,这看起来可能是O(log(n)),但根据实际计时,它似乎在所有可能的情况下呈线性增长n 的值。

    所以我不确定。

    【讨论】:

    • 为什么不呢,但是函数 to 和 from 正在创建两个新地图,这可能是不可取的。
    猜你喜欢
    • 2011-07-21
    • 2010-11-21
    • 1970-01-01
    • 2021-12-27
    • 1970-01-01
    • 2013-04-06
    • 2011-10-18
    • 2012-05-18
    • 1970-01-01
    相关资源
    最近更新 更多