如何在列表中搜索,如果没有找到,就选择最近的最高值的灵药。

问题描述 投票:0回答:1

我有这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

elixir
1个回答
0
投票

最快的方法是把长列表和短列表都缩小。 的短表同时进行。

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"]
© www.soinside.com 2019 - 2024. All rights reserved.