我试着想出一种数据结构,用来探索那些用关键术语标记的数据,比如“系统理论”或“互联网”,使用一些我喜欢的集合和格理论概念。我想也许我可以扩展散列图的工作方式。我为我想要的行为写了一些测试,然后我意识到我不知道如何使用类型和协议来工作或工作。
我的想法是。我想用一组字符串来索引数据集合。例如,
(def data { #{"systems theory" "internet"} [1 2 3]
#{"systems theory" "biology"} [4 5]
#{"systems theory"} [6 7 8] })免费,我得到
(data #{"systems theory"})
;=> [6 7 8]这很好。
但是如果能做这样的事情也是很巧妙的
(data "biology")
;=> { #{"systems theory"} [4 5] }当我想到这一点时,我想要告诉get PersistentHashMap方法正常工作并不困难,除非它被要求使用字符串作为键,在这种情况下,需要做任何必要的事情来获得新的数据结构。但是当涉及到编写代码的时候,我只是搞得一团糟,实际上我不知道如何设计这个东西。
我有福格斯的“克鲁格的Joy”的副本,我将阅读关于类型和协议以及扩展类型之类的内容,看看我是否能理解内置函数是如何定义和改变的。但我也想要个提示。
发布于 2015-07-12 22:26:42
我不会创建一个新的专用地图实现,而是根据原始数据创建一个简单的索引映射:
(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]}如果需要,还可以将两者合并:
(def full-index (merge data cats))
(get full-index "internet") ;=> {#{"systems theory"} [1 2 3]}
(get full-index #{"systems theory"}) ;=> [6 7 8]如果仍然希望创建专用地图实现,则可能需要查看以下内容:
sorted-map。如果您想保持散列映射的语义(例如,count应该返回原始映射计数的和加上新的键计数),那就不容易了。您可能希望使用收集-核对来测试您的实现。
发布于 2015-07-12 22:17:26
您所描述的可能是可能的,但我认为您最好只编写一个函数来筛选包含搜索条件的任何集合的列表。
另外,考虑您将要使用的访问模式,我怀疑将字符串作为键和一组中的文档ids可能会更高效、更灵活。
https://stackoverflow.com/questions/31371901
复制相似问题