Lua在表中查找随机键匹配

我有一个和弦表格,包含和弦名称和起始时间,有很多相同名称的不同起始时间。我需要随机选择一个匹配的和弦_name

chord_name = "Cm7b5"
time = chords[chord_name].Start
点赞
用户3371355
用户3371355

如果你需要从 chords 中随机选出一个名为 chord_name 的和弦,且它们的索引是连续的(如:1、2、3、4、5),你可以这样做:

chord_name = "Cm7b5"

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

time = chords[index].Start

(请注意,我选择的不是和弦,而是和弦开始的时间,就像你的示例所展示的。)

但是,如果你有大量数据,而只有一小部分具有 .Name == chord_name,则上述方法极有可能陷入(几乎)无限循环。

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

chord_name = "Cm7b5"

--我们创建一个空表
indexes = {}

--并将符合条件 chords[index].Name == chord_name 的所有索引存储在这个表中
for index, chord in pairs(chords) do
    if chord.Name == chord_name then
        table.insert(indexes, index)
    end
end

--现在我们可以从这个表中随机选择
index = indexes[math.random(#indexes)]

--这将始终产生一个指向 .Name == chord_name 的和弦的索引
time = chords[index].Start

请注意,使用 pairs(chords) 还允许选择有缺口的表中的和弦(例如:{[1] = "a", [5] = "b", [16] = "c"})。

另一方面,后面的解决方法如果你有大量(即数百万或十万)的数据,可能会导致问题。遍历整个表格并选择匹配的名称,以及基于此创建一个新表,会消耗大量的时间和内存。

2019-11-03 08:37:38