如何将整数Enum转字符串拼接后拆分出不超100字符且不切分数字的块
实现方案
Enum.chunk_while/4完全适用该需求,推荐不要先完成全量拼接再拆分,直接在字符串列表阶段按长度累积分块即可,既保证不会切分数字,内存效率也更高。
实现步骤如下:
- 先把整数类型Enum统一转为字符串列表
- 通过
chunk_while累积当前块的元素和拼接后的总长度(总长度需算上元素之间的空格),长度即将超出限制时就切出当前块 - 最后把每个分块的字符串列表用空格拼接即可
代码示例
def split_int_enum(int_enum, max_length \\ 100) do int_enum |> Enum.map(&to_string/1) |> Enum.chunk_while( # 初始累加器结构:{当前块的字符串列表, 当前块拼接后的总长度} {[], 0}, fn str, {current_list, current_len} -> # 首个元素不需要加前置空格,后续元素需要加1个空格的长度 add_space_len = if current_list == [], do: 0, else: 1 new_total_len = current_len + add_space_len + String.length(str) if new_total_len <= max_length do # 长度未超出,继续累积元素 {:cont, {[str | current_list], new_total_len}} else # 长度超出,输出当前块,当前元素作为新块的首个元素 {:cont, Enum.reverse(current_list), {[str], String.length(str)}} end end, # 遍历结束后输出剩余的块 fn {current_list, _len} -> {:cont, Enum.reverse(current_list), []} end ) # 每个分块拼接为空格分隔的字符串 |> Enum.map(&Enum.join(&1, " ")) end
注意事项
- 如果存在单个整数转字符串后长度就超过100的情况,可以提前加判断逻辑,要么单独作为一个块,要么按业务要求抛出异常
- 若一定要先完成全量拼接再拆分,也可以用正则
~r/.{1,100}(?:\s|$)/匹配,但全量拼接超长列表时内存占用会远高于分块处理方案,不推荐使用
内容的提问来源于stack exchange,提问作者Mircea
相关产品推荐
相关产品推荐

