我有这2份名单。
一张单子是:
[~U[2020-05-20 11:00:00.123456Z], ~U[2020-05-20 11:20:00.123456Z],
~U[2020-05-20 11:40:00.123456Z]]
第二个列表是:
["00_02_000.jpg", "00_06_000.jpg", "00_14_000.jpg", "00_18_000.jpg",
"00_22_000.jpg", "00_30_000.jpg", "00_34_000.jpg", "00_38_000.jpg",
"00_42_000.jpg", "00_46_000.jpg", "00_54_000.jpg", "00_58_000.jpg",
"01_02_000.jpg", "01_10_000.jpg", "01_14_000.jpg", "01_18_000.jpg",
"01_22_000.jpg", "01_30_000.jpg", "01_34_000.jpg", "01_38_000.jpg",
"01_42_000.jpg", "01_50_000.jpg", "01_54_000.jpg", "01_58_000.jpg",
"02_02_000.jpg", "02_06_000.jpg", "02_25_000.jpg", "02_29_000.jpg",
"02_33_000.jpg", "02_41_000.jpg", "02_45_000.jpg", "02_49_000.jpg",
"02_53_000.jpg", "03_01_000.jpg", "03_05_000.jpg", "03_09_000.jpg",
"03_13_000.jpg", "03_21_000.jpg", "03_25_000.jpg", "03_29_000.jpg",
"03_33_000.jpg", "03_41_000.jpg", "03_45_000.jpg", "03_49_000.jpg",
"03_53_000.jpg", "04_01_000.jpg", "04_05_000.jpg", "04_09_000.jpg",
"04_13_000.jpg", "04_21_000.jpg", ...]
现在,我首先要把第一个列表转换为:
["00_00_000.jpg", "20_00_000.jpg", "40_00_000.jpg"]
这是通过strftime完成的。
然后我想创建第三个大小为3的列表。
["00_00_000.jpg", "20_00_000.jpg", "40_00_000.jpg"]
如果它存在于第二个列表中,则选择它的下一个值。
如果它不在第二个列表中,则选择它的下一个值。 例如
在上述名单中,没有 00_00_000.jpg
所以我想选择 00_02_000.jpg
一样 20_00_000.jpg
更新:由此产生的列表或者应该是这样的
["00_00_000.jpg", "20_00_000.jpg", "40_00_000.jpg"]
的非常巢值,这3。
的下一个值。"00_00_000.jpg"
是 "00_02_000.jpg"
犹如 20_00_000.jpg
不存在的下一个可以 21_00_000.jpg
最快的方法是把长列表和短列表都缩小。和 的短表同时进行。
values =
["00_02_000.jpg", "00_06_000.jpg", "00_14_000.jpg", "00_18_000.jpg",
"00_22_000.jpg", "00_30_000.jpg", "00_34_000.jpg", "00_38_000.jpg",
"00_42_000.jpg", "00_46_000.jpg", "00_54_000.jpg", "00_58_000.jpg",
"01_02_000.jpg", "01_10_000.jpg", "01_14_000.jpg", "01_18_000.jpg",
"01_22_000.jpg", "01_30_000.jpg", "01_34_000.jpg", "01_38_000.jpg",
"01_42_000.jpg", "01_50_000.jpg", "01_54_000.jpg", "01_58_000.jpg",
"02_02_000.jpg", "02_06_000.jpg", "02_25_000.jpg", "02_29_000.jpg",
"02_33_000.jpg", "02_41_000.jpg", "02_45_000.jpg", "02_49_000.jpg",
"02_53_000.jpg", "03_01_000.jpg", "03_05_000.jpg", "03_09_000.jpg",
"03_13_000.jpg", "03_21_000.jpg", "03_25_000.jpg", "03_29_000.jpg",
"03_33_000.jpg", "03_41_000.jpg", "03_45_000.jpg", "03_49_000.jpg",
"03_53_000.jpg", "04_01_000.jpg", "04_05_000.jpg", "04_09_000.jpg",
"04_13_000.jpg", "04_21_000.jpg"]
list = Enum.sort(["00_00_000.jpg", "02_01_000.jpg", "04_01_000.jpg"])
values
|> Enum.reduce_while({list, []}, fn
_, {[], acc} -> {:halt, acc}
e, {[h|t], acc} ->
{:cont,
if(String.split(e, ~w[_ .]) < String.split(h, ~w[_ .]),
do: {[h|t], acc},
else: {t, [e | acc]})
}
end)
|> Enum.reverse()
#⇒ ["00_02_000.jpg", "02_02_000.jpg", "04_01_000.jpg"]
基本上,这里我们在长列表中走一遍,一旦遇到大于或等于短列表中的当前头的值,我们都会有 注入蓄能器 和 除名.
如果性能不是很关键,将短列表映射到长列表中第一个发现的解决方案可能会更容易阅读和支持。
Enum.map(list, fn e ->
Enum.find(values,
&(String.split(e, ~w[_ .]) <= String.split(&1, ~w[_ .])))
end)
#⇒ ["00_02_000.jpg", "02_02_000.jpg", "04_01_000.jpg"]