【问题标题】:LISP key-value binding store and look upLISP 键值绑定存储和查找
【发布时间】:2012-10-21 18:30:57
【问题描述】:

我正在学习 LISP,只是想问在 LISP 程序中存储键值对的最佳选择是什么。

对于我提到的键值对,我想像JAVA中的Map Collection一样使用它:我想用值存储键,并且可以通过键查找值。
例如:如果我有一个字符串"apple""fruit"匹配,如果它不存在,我希望能够存储该对,并可以查询与"apple"关联的值,即水果.

任何建议或代码示例都会非常有帮助。提前谢谢你

【问题讨论】:

  • 使用哈希表,对于字符串键,您还需要指定 EQUAL 作为测试参数(默认为 EQL,它不适用于字符串:想想 Java 的 ==equals())

标签: lisp key-value


【解决方案1】:

你没有指定你正在学习哪个 Lisp(Scheme、Common Lisp 等)所以我猜是 Common Lisp。如果我不正确,请发表评论,我会相应地进行编辑。

在 Lisp 中,这样的东西称为关联列表。它非常常用,因此有一些方便的功能可以使它成为可能。不过,它的核心实际上只不过是一个配对列表((key . value) ... )

我建议您查看Carnegie Melon's explanation,它会为您提供assocalist-cons 等函数的简要概述,这使得使用关联列表变得容易。我发现它很有帮助。

关联列表的问题在于虽然它们具有恒定的时间插入、删除和查找都是O(n)。因此,如果速度是一个大问题,您将需要转向实际的哈希表。

Common Lisp Cook book 对此有很好的解释。它们依赖于允许恒定时间随机访问的实际数组(有时称为向量)。与关联列表不同,它们确实提供 O(1) 查找。然而,它们不像关联列表那样易于使用,因为 Lisp 通常擅长列表。

注意:对于Scheme,如果您的编译器默认不提供这些函数,那么这些函数中的大部分都应该提供SRFI 1 和69 扩展。

【讨论】:

    【解决方案2】:

    在 Common Lisp 中,您可以使用关联列表。

    请参阅有关 association lists 和函数 ASSOC 的 Common Lisp Hyperspec

    对于更复杂和更快的事情,Common Lisp 提供了hash tables

    【讨论】:

      【解决方案3】:

      为了公平起见,Java 中的Map 是一个接口。它有各种不同的实现,它们在读/写/删除操作中可能不会为您提供相同的复杂性。有些可以实现为链表,有些可能是二进制尝试等。

      Map in Java 定义了您访问数据的方式,但没有定义数据的存储方式。

      Lisps,好吧,如果你想到 CLOS,就没有接口的概念,这是因为 CLOS 支持多重继承。与 Java 的 Map 没有充分的相似之处,仅仅是因为没有以这种方式访问​​集合的概念,也没有接口的概念,因为它们存在于 Java 中。

      Map 在 Java 中有几个标准实现。一种是HashMapHashtable 与它非常相似)。这与 Common Lisp 中的 hash-table 类非常相似。 Java中还有LinkedHashMap,与Lisp中的关联列表非常相似。一个简单的 Lisp 不提供红黑树映射,并且没有关于线程的标准化行为 - 您需要阅读有关特定实现的文档,但您可以在这里找到各种数据结构的许多良好实现: http://www.cliki.net/Data%20structure.

      【讨论】:

        猜你喜欢
        • 2012-08-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-12
        • 1970-01-01
        • 2013-07-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多