Lua在表中找到随机键匹配

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

我有一个带有和弦名称和开始时间的和弦表,在不同的开始时间有许多相同的名称。我需要随机选择一个匹配的和弦名称

chord_name = "Cm7b5"
time = chords[chord_name].Start
lua
1个回答
0
投票

因此,如果您需要从chord中选择一个随机的chords,以便chords[index].Name == chord_name和您的索引是一个接一个的,例如:1、2、3、4、5(例如:52、96, 121)您可以:

chord_name = "Cm7b5"

index = math.random(#chords)
while chords[index].Name ~= chord_name do
    index = math.random(#chords)
end

time = chords[index].Start

(请注意,我没有选择和弦,而是您的示例显示了.Start时间。]

但是,如果您有很多数据并且只有少数几个具有.Name == chord_name,则这极有可能(几乎)无限循环。

因此,确保对math.random()的单次调用将给我们确定的答案(索引),是一个好主意。

chord_name = "Cm7b5"

--we create an empty table
indexes = {}

--and store all indexes that fulfil the condition chords[index].Name == chord_name
for index, chord in pairs(chords) do
    if chord.Name == chord_name then
        table.insert(indexes, index)
    end
end

--now we can randomly select from this table
index = indexes[math.random(#indexes)]

--which will always yield an index pointing to a chord with .Name == chord_name
time = chords[index].Start

注意,使用pairs(chords)还可以从带孔的桌子中选择和弦(即{[1] = "a", [5] = "b", [16] = "c"})。

另一方面,如果您有很多数据(可能是数百万或100k),则后一种解决方案可能会出现问题。遍历整个表并选择匹配的名称,然后基于该表创建新表将非常耗时且占用内存。

© www.soinside.com 2019 - 2024. All rights reserved.