首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >遮蔽持久性-- Shadowing的“get”函数

遮蔽持久性-- Shadowing的“get”函数
EN

Stack Overflow用户
提问于 2015-07-12 19:52:49
回答 2查看 86关注 0票数 2

我试着想出一种数据结构,用来探索那些用关键术语标记的数据,比如“系统理论”或“互联网”,使用一些我喜欢的集合和格理论概念。我想也许我可以扩展散列图的工作方式。我为我想要的行为写了一些测试,然后我意识到我不知道如何使用类型和协议来工作或工作。

我的想法是。我想用一组字符串来索引数据集合。例如,

代码语言:javascript
复制
(def data { #{"systems theory" "internet"} [1 2 3]
  #{"systems theory" "biology"} [4 5]
  #{"systems theory"} [6 7 8] })

免费,我得到

代码语言:javascript
复制
(data #{"systems theory"})
;=> [6 7 8]

这很好。

但是如果能做这样的事情也是很巧妙的

代码语言:javascript
复制
(data "biology")
;=> { #{"systems theory"} [4 5] }

当我想到这一点时,我想要告诉get PersistentHashMap方法正常工作并不困难,除非它被要求使用字符串作为键,在这种情况下,需要做任何必要的事情来获得新的数据结构。但是当涉及到编写代码的时候,我只是搞得一团糟,实际上我不知道如何设计这个东西。

我有福格斯的“克鲁格的Joy”的副本,我将阅读关于类型和协议以及扩展类型之类的内容,看看我是否能理解内置函数是如何定义和改变的。但我也想要个提示。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-07-12 22:26:42

我不会创建一个新的专用地图实现,而是根据原始数据创建一个简单的索引映射:

代码语言:javascript
复制
(def data {#{"systems theory" "internet"} [1 2 3]
           #{"systems theory" "biology"} [4 5]
           #{"systems theory"} [6 7 8] })

(def cats (->> data
               (map (fn [[cats val]]
                      (->> cats
                           (map (juxt identity #(hash-map (disj cats %) val)))
                           (into {}))))
               (apply merge)))

(get cats "internet")
;=> {#{"systems theory"} [1 2 3]}

(get cats "biology")
;=> {#{"systems theory"} [4 5]}

(get cats "systems theory")
;=> {#{"biology"} [4 5]}

如果需要,还可以将两者合并:

代码语言:javascript
复制
(def full-index (merge data cats))

(get full-index "internet") ;=> {#{"systems theory"} [1 2 3]}
(get full-index #{"systems theory"}) ;=> [6 7 8]

如果仍然希望创建专用地图实现,则可能需要查看以下内容:

  • PersistenHashMap实现
  • sorted.clj:“Clojure的排序集合的实现,用Clojure编写的”。例如,请参阅用于实现PersistentTreeMap代码sorted-map
  • data.avl:“具有日志时间等级查询的持久化排序映射和集”
  • data.priority-map:“优先级映射非常类似于排序映射,但是排序映射生成按键排序的条目序列,优先级映射生成按值排序的条目。”也许代码比其他代码更容易理解。

如果您想保持散列映射的语义(例如,count应该返回原始映射计数的和加上新的键计数),那就不容易了。您可能希望使用收集-核对来测试您的实现。

票数 2
EN

Stack Overflow用户

发布于 2015-07-12 22:17:26

您所描述的可能是可能的,但我认为您最好只编写一个函数来筛选包含搜索条件的任何集合的列表。

另外,考虑您将要使用的访问模式,我怀疑将字符串作为键和一组中的文档ids可能会更高效、更灵活。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31371901

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档