我有以下数据结构:
["a 1" "b 2" "c 3"]
我如何将其转换为哈希映射?
我想要以下数据结构:
{:a 1 :b 2 :c 3}
配置
在clojure 1.10.3和openjdk 17.0.1下测试
问题
下面是斐波那契记忆法的稍微修改版,一般技术参考维基记忆法。
(def fib
(memoize #(condp = %
0 (bigdec 0)
1 1
(+ (fib (dec %)) (fib (- % 2))))))
(fib 225) ; line 7
Run Code Online (Sandbox Code Playgroud)
我原以为像Clojure这样的FPmemoized Fibonacci中的上述内容在精神上相当于下面Python中的命令式DP,
def fib(n):
dp = [0, 1] + [0] * n
for i in range(2, n + 1):
dp[i] = dp[i - 1] + dp[i - 2]
return dp[n]
Run Code Online (Sandbox Code Playgroud)
问题1
在我的例子中,当斐波那契数升至225时,为什么实际上会出现以下错误?
Syntax error (StackOverflowError) …Run Code Online (Sandbox Code Playgroud) 我正在尝试循环一组字符串,删除多余的文本。它有效,但太好了。给定这样的输入:
#{"TORCASO,133114,117,0.04,89045.38,99.00,0.00,0.00,0.00,0.00,0.00" "POTOCZNY,98770,170,0.06,87231.39,98.82,0.00,(S),0.00,0.00,(S)"}
Run Code Online (Sandbox Code Playgroud)
我的输出如下所示:
#{\A \C \N \O \P \R \S \T \Y \Z}
Run Code Online (Sandbox Code Playgroud)
但我希望它看起来像这样:
#{"TORCASO" "POTOCZNY"}
Run Code Online (Sandbox Code Playgroud)
这是我的代码:
(defn shorten-string
[string]
(first (str/split string #",")))
(defn handle-csv
[strings]
(loop [remaining-strings strings final-set #{}]
(if (empty? remaining-strings)
final-set
(let [[part & remaining] remaining-strings]
(recur remaining
(into final-set
(shorten-string part)))))))
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?
我在 clojure 中有两个地图向量,我希望将它们合并,使其成为单个地图向量,但每个索引处的地图都被合并。我只是想知道做到这一点的最佳方法。
例如:
[{:sku "e1" :name "example1"} {:sku "e2" :name "example2"}]
[{:color "Blue" :price 9.99} {:color "Red" :price 15.99}]
Run Code Online (Sandbox Code Playgroud)
将合并为:
[{:sku "e1" :name "example1" :color "Blue" :price 9.99} {:sku "e2" :name "example2" :color "Red" :price 15.99}]
Run Code Online (Sandbox Code Playgroud) 我正在尝试为一个函数编写一个 clojure 规范,该函数采用以下两个映射作为参数。
{1 BL0-MD0-SU, 0 BL0-SM0-SU}
{0 [https://gateway.pinata.cloud/ipfs/QmcLjsUDHVuy8GPUPmj4ZdGa3FWTfGnsKhWZ4dxqUaGGXk/doge.jpg ], 1 [https://gateway.pinata.cloud/ipfs/QmcLjsUDHVuy8GPUPmj4ZdGa3FWTfGnsKhWZ4dxqUaGGXk/doge.jpg ]}
Run Code Online (Sandbox Code Playgroud)
每张地图的长度可以不同,具体取决于用户希望购买多少件 T 恤。我不确定如何为此编写规范,以允许每个映射中的键和值的数量发生变化。如果我可以断言每个映射都包含相同数量的键,那也会很有用。
编辑:
当以下内容通过时,规范也应该通过:
{1 BL0-MD0-SU, 0 BL0-SM0-SU, 2 BL0-LG0-SU}
{0 [https://gateway.pinata.cloud/ipfs/QmcLjsUDHVuy8GPUPmj4ZdGa3FWTfGnsKhWZ4dxqUaGGXk/doge.jpg ], 1 [https://gateway.pinata.cloud/ipfs/QmcLjsUDHVuy8GPUPmj4ZdGa3FWTfGnsKhWZ4dxqUaGGXk/doge.jpg ], 2 [ ]}
Run Code Online (Sandbox Code Playgroud) Clojureempty改变了 Java 集合的类型。例如一个JavaParser MethodCallExpr物体mce,
(type (.getArguments mce))
;; => com.github.javaparser.ast.NodeList
(type (emtpy (.getArguments mce)))
;; => nil
(type (into (empty (.getArguments mce)) (.getArguments mce)))
;; => clojure.lang.PersistentList
Run Code Online (Sandbox Code Playgroud)
但(.setArguments mce ???)需要???是 a NodeList<Expression>,那么如何???在 clojure 中创建一个对象呢?
谢谢!
假设您有以下代码:
(reduce + 1 (range 1 13000))
Run Code Online (Sandbox Code Playgroud)
这是否不会导致堆栈溢出,因为它没有优化尾部调用?或者说reduce类似于循环?
从视觉上看,with-open看起来类似于let。我知道 with-open 是有不同的目的,但我找不到关于正在with-open做什么的明确答案。并且,with-open 中的第一个参数是什么?
文档是这样说的:
“bindings => [name init ...] 评估 try 表达式中的主体,其中名称绑定到 inits 的值,以及以相反顺序对每个名称调用 (.close name) 的 finally 子句。”
我不明白。如果有人解释 with-open 的实际用途,我将不胜感激?
我有一个只能解码密钥的要求。
考虑下面的例子 -
(require '[jsonista.core :as json])
(import
(com.fasterxml.jackson.core JsonFactory$Feature)
(com.fasterxml.jackson.databind ObjectMapper)
(com.fasterxml.jackson.datatype.joda JodaModule))
(def s "{\"name\":\"person1\",\"book\":\"Demo Book\",\"hash\":{\"key1\":\"value1\",\"key2\":\"value2\",\"key3\":\"value3\"}}")
(def ^ObjectMapper object-mapper
(let [obj-mapper (json/object-mapper {:decode-key-fn true :modules [(JodaModule.)]})]
(doto obj-mapper
(-> .getFactory (.disable JsonFactory$Feature/USE_THREAD_LOCAL_FOR_BUFFER_RECYCLING)))
obj-mapper))
(json/read-value s object-mapper)
Run Code Online (Sandbox Code Playgroud)
我想得到的输出是
{:book "Demo Book", :name "person1", :hash {"key3" "value3", "key2" "value2", "key1" "value1"}}
Run Code Online (Sandbox Code Playgroud)
在上面的 json 中,顶层被转换为键,嵌套不会转换为键,而是保留为字符串。
:decode-key-fn true使所有键和没有:decode-key-fn true所有键都是字符串,这不是我想要的。我怎样才能达到同样的效果?
我需要命名空间,我可以使用它:
(ns core
(:require [hello :as h]))
(println h/x)
Run Code Online (Sandbox Code Playgroud)
但为什么我不能只打印名称空间?
(println h) # Unable to resolve symbol: h in this context
Run Code Online (Sandbox Code Playgroud)
我用 deps-tools 和 leiningen 尝试过这个
clojure ×10
clojure.spec ×1
javaparser ×1
leiningen ×1
loops ×1
maps ×1
memoization ×1
merge ×1
testing ×1
vector ×1