Clojure字符串列表分区:按指定长度累加拼接实现方案咨询
解决Clojure中字符串列表分段累加的问题
别担心,这种根据长度阈值分段拼接字符串的需求很常见,我来帮你用Clojure实现这个功能!
首先咱们再明确下需求:遍历原字符串列表,不断累加拼接字符串,当拼接后的总长度超过指定最大值时,就把当前已累加的字符串存入结果列表,然后重置累加器,从下一个字符串重新开始;最后别忘了把最后一段累加的字符串也加入结果。
比如你提到的最大长度为4的场景,假设原列表是 ["a", "bb", "ccc", "d", "ee"],最终结果应该是 ["abb", "cccd", "ee"]——咱们一步步走的话:
- 累加"a"+"bb"得到"abb"(长度3≤4),继续;
- 加上"ccc"的话总长度会变成6>4,所以把"abb"存入结果,累加器重置为"ccc";
- 累加"ccc"+"d"得到"cccd"(长度4≤4),继续;
- 加上"ee"总长度变成6>4,把"cccd"存入结果,累加器重置为"ee";
- 遍历结束后,把最后剩下的"ee"加入结果。
具体实现代码
我们可以用Clojure的reduce函数来处理这种带状态的累加逻辑,代码如下:
(defn chunk-strings [max-length str-list] (let [final-state (reduce (fn [{:keys [current result]} s] (let [new-length (+ (count current) (count s))] (if (> new-length max-length) ;; 超过阈值:把当前累加值存入结果,重置累加器为当前字符串 {:current s :result (conj result current)} ;; 未超过:继续累加 {:current (str current s) :result result}))) ;; 初始状态:空累加器 + 空结果列表 {:current "" :result []} str-list)] ;; 最后把剩余的累加值加入结果(避免遗漏最后一段) (if (seq (:current final-state)) (conj (:result final-state) (:current final-state)) (:result final-state))))
测试验证
咱们用刚才的例子测试一下:
(chunk-strings 4 ["a" "bb" "ccc" "d" "ee"]) ;; 输出:["abb" "cccd" "ee"]
再试几个边界场景:
- 单个字符串长度超过阈值:
(chunk-strings 4 ["aaaaa"])→["aaaaa"] - 空输入列表:
(chunk-strings 4 [])→[] - 刚好凑到阈值:
(chunk-strings 4 ["aa" "aa"])→["aaaa"]
这样应该就能满足你的需求啦,如果有其他特殊场景需要调整,随时说!
内容的提问来源于stack exchange,提问作者Hoopes
相关产品推荐
相关产品推荐

