Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clojure 2d列表到哈希映射_Clojure_Hashmap_Lazy Sequences - Fatal编程技术网

Clojure 2d列表到哈希映射

Clojure 2d列表到哈希映射,clojure,hashmap,lazy-sequences,Clojure,Hashmap,Lazy Sequences,我有一个这样的无限列表: ((11)(39)(517)…) 我想用它做一个哈希映射: {:11:39:517…) 基本上,“内部”列表的第一个元素是关键字,而第二个元素是值。我不确定在创建时创建我使用的列表是否更容易: (迭代(fn[[ab][(a的计算)(b的计算)])[11]) (b)的计算需要(a),所以我认为在这一点上(a)不可能是一个关键字…这一点的全部意义是,人们可以很容易地访问(a)给定的值(b) 任何想法都将不胜感激 --编辑-- 好吧,我想起来了: (将我的映射定义为{}(映射

我有一个这样的无限列表:
((11)(39)(517)…)
我想用它做一个哈希映射:
{:11:39:517…)

基本上,“内部”列表的第一个元素是关键字,而第二个元素是值。我不确定在创建时创建我使用的列表是否更容易:

(迭代(fn[[ab][(a的计算)(b的计算)])[11])

(b)的计算需要(a),所以我认为在这一点上(a)不可能是一个关键字…这一点的全部意义是,人们可以很容易地访问(a)给定的值(b)

任何想法都将不胜感激

--编辑--
好吧,我想起来了:

(将我的映射定义为{}(映射#)(哈希映射(关键字(str(first%)))(first(rest%)))我的列表)))


问题是:它似乎并不懒惰……即使我没有消费过它,它也会永远消失。有没有办法强迫它懒惰?

要从序列中创建哈希映射,您可以尝试:

(defn to-map [s] (zipmap (map (comp keyword str first) s) (map second s)))

=> (to-map '((1 1)(3 9)(5 17)))
=> {:5 17, :3 9, :1 1}

要从序列生成哈希映射,您可以尝试:

(defn to-map [s] (zipmap (map (comp keyword str first) s) (map second s)))

=> (to-map '((1 1)(3 9)(5 17)))
=> {:5 17, :3 9, :1 1}

如果您使用flatte将它展平为一个(kvkvkv)列表,那么您可以使用apply调用该列表作为参数的哈希映射,该列表将为您提供所需的列表

user> (apply hash-map (flatten '((1 1)(3 9)(5 17))))
{1 1, 3 9, 5 17}
尽管它没有对第一个参数设置关键字

至少在clojure中,与某个键关联的最后一个值被称为该键的值。如果不是这种情况,则无法为已在映射中的键生成具有不同值的新映射,因为第一个(现在是阴影键)将由lookup函数返回。如果lookup函数搜索到最后,则它不是懒惰的。您可以通过编写自己的映射实现来解决此问题,该映射实现使用关联列表,但它缺少Clojure基于树的映射的性能保证,因为在最坏的情况下,它将退化为线性时间


我不确定让输入序列保持惰性是否会得到想要的结果。

如果您使用flatten将其展平为(k v k v k v k v)列表,那么您可以使用apply调用哈希映射,并将该列表作为参数,从而为您提供所需的列表

user> (apply hash-map (flatten '((1 1)(3 9)(5 17))))
{1 1, 3 9, 5 17}
尽管它没有对第一个参数设置关键字

至少在clojure中,与某个键关联的最后一个值被称为该键的值。如果不是这种情况,则无法为已在映射中的键生成具有不同值的新映射,因为第一个(现在是阴影键)将由lookup函数返回。如果lookup函数搜索到最后,则它不是懒惰的。您可以通过编写自己的映射实现来解决此问题,该映射实现使用关联列表,但它缺少Clojure基于树的映射的性能保证,因为在最坏的情况下,它将退化为线性时间


我不确定让输入序列保持惰性是否会得到想要的结果。

您可以用这种方法稍后将该结构转换为哈希映射

(def it #(iterate (fn [[a b]] [(+ a 1) (+ b 1)]) [1 1])) 
(apply hash-map (apply concat (take 3 (it))))
=> {1 1, 2 2, 3 3}

以后可以通过这种方式将该结构转换为哈希映射

(def it #(iterate (fn [[a b]] [(+ a 1) (+ b 1)]) [1 1])) 
(apply hash-map (apply concat (take 3 (it))))
=> {1 1, 2 2, 3 3}

为了实现懒惰,计算机必须在每次请求密钥时对输入序列进行线性扫描,至少在密钥超出目前已扫描的范围时是这样。一个简单的解决方案就是每次扫描序列,如下所示:

(defn get-val [coll k] (some (fn [[a b]] (when (= k a) b)) coll)) (get-val '((1 1)(3 9)(5 17)) 3) ;=> 9 (定义获取值[coll k] (一些(fn[[a b]](当(=k a)b))coll) 获得val'((11)(39)(517)) 3) ;=> 9 一个稍微不那么简单的解决方案是使用
memoize
来缓存
get val
的结果,尽管这仍然会比严格需要的更扫描输入序列。一个更积极的缓存解决方案是使用atom(就像
memoize
内部所做的那样)缓存所看到的每一对,从而在查找需要尚未看到的内容时只消耗更多的输入序列


无论如何,我不建议将其包装在哈希映射API中,因为这意味着高效的不可变“更新”这可能不需要,但很难实现。我通常也不建议对键进行关键词化。

为了懒惰,每次请求键时,计算机都必须对输入序列进行线性扫描,至少在键超出目前扫描范围的情况下是这样。一个简单的解决方案是just每次扫描序列,如下所示:

(defn get-val [coll k] (some (fn [[a b]] (when (= k a) b)) coll)) (get-val '((1 1)(3 9)(5 17)) 3) ;=> 9 (定义获取值[coll k] (一些(fn[[a b]](当(=k a)b))coll) 获得val'((11)(39)(517)) 3) ;=> 9 一个稍微不那么简单的解决方案是使用
memoize
来缓存
get val
的结果,尽管这仍然会比严格需要的更扫描输入序列。一个更积极的缓存解决方案是使用atom(就像
memoize
内部所做的那样)缓存所看到的每一对,从而在查找需要尚未看到的内容时只消耗更多的输入序列


无论如何,我不建议将其包装在哈希映射API中,因为这意味着高效的不可变“更新”这可能不需要,但很难实现。我通常也不建议对键进行关键字设置。

问题是哈希映射既不是无限的,也不是惰性的。它们是为快速键值访问而设计的。因此,如果您有哈希映射,您将能够执行快速键查找。键值访问是核心ide一组散列映射,但它使创建惰性无限散列映射成为不可能

假设我们有一个无限的2d列表,那么您只需使用
进入
即可创建哈希映射:

(into {} (vec (map vec my-list)))
但是没有办法使这个散列映射无限大。因此,唯一的解决方案是创建自己的散列映射,如。在这种情况下,您将有一个无限大的2d序列和一个函数来执行延迟键查找

实际上,他的解决方案可以稍加改进:

(def my-map (atom {}))

(def my-seq (atom (partition 2 (range))))

(defn build-map [stop]
  (when-let [[k v] (first @my-seq)]
    (swap! my-seq rest)
    (swap! my-map #(assoc % k v))
    (if (= k stop)
        v
        (recur stop))))

(defn get-val [k]
  (if-let [v (@my-map k)]
    v
    (build-map k)))
my-map
在我的示例中存储当前哈希映射,
my-seq
存储not序列