【问题标题】:Array Processing in LivecodeLivecode 中的数组处理
【发布时间】:2013-11-18 19:14:22
【问题描述】:

我很高兴 Livecode 数组实际上是关联数组,但我想知道您是否可以通过索引而不是键来访问它们?

我想将 5 个字符串放入一个数组中,所以到目前为止我所知道的只是

put "fred" into myArray[1]
put "wilma" into myArray[2]
put "barney" into myArray[3]
put "betty" into myArray[4]
put "dino" into myArray[5]

这为我创建了我的数组,我可以通过声明一个变量并在循环中递增它来遍历它,使用myArray[index]访问它

不过,在这种情况下,我觉得这仍然是在进行键控查找,而不是使用索引来引用数组中的位置。

真正伤害我的地方是当我这样做时

delete variable myArray[3]

果然,barney 被删除了,我的数组现在认为其中有 4 个项目。所以,如果我再次询问数组的第三个成员,就像我来自 Java / C 背景一样,我希望得到“贝蒂”——但我没有——我什么也得不到,因为现在没有以“3”为键的数组成员

那么,我可以通过索引访问数组,还是我总是必须进行键控检索?

【问题讨论】:

    标签: arrays livecode


    【解决方案1】:

    我知道这是一个旧线程,但来自其他语言,我也一直在为 LiveCode 中缺乏真正的线性数组而苦苦挣扎。因此,对于发生在此线程上的其他任何人:

    由于 LiveCode 似乎对文本方法(块表达式)有相当完整的补充,我一直在变量而不是数组中使用逗号分隔的字符串。

    在上面的原始示例中,从字符串中删除第 3 项“barney”会将“betty”移动到第 3 项的位置。它还会返回 4 而不是 5 的长度。

    这绝对是一种不同的思维方式,但在没有线性阵列的情况下,这对我来说一直有效。

    【讨论】:

      【解决方案2】:

      你可以这样做,但你仍然需要使用索引。由于要使用数字索引,因此需要对键进行排序。 (LiveCode 数组很快,因为键是未排序的)。

      put the keys of myArray into myKeys
      sort the lines of myKeys numeric
      put myArray[line 3 of myKeys] into myName
      

      你可以通过使用一个函数来使它成为一个(假的)单行:

      -- usage:
      put myArray[sortedKey(3,myArray)] into myName
      
      function sortedKey(theIndex,theArray)
        put theKeys of theArray into myKeys
        sort the lines of myKeys numeric
        return line theIndex of myKeys
      end sortedKey
      

      显然,这个问题有多种解决方案。请记住,排序会减慢数组的处理速度。

      【讨论】:

      • 谢谢马克 - 但我不确定这对我有什么帮助 - 在我上面的例子中,我不会仍然留下 1,2,4 和 5 的键,而不是 1,2 ,3, & 4 在我删除键为 3 的项目并重新排序数组后?
      • 戴夫,我写的函数正是你想要的。但是,您不能直接按数字访问密钥,因为它们是未排序的。所以,真正的答案是,你不能完全按照你的意愿去做,但有办法绕过它。请试试这个脚本。
      • 请注意,put myArray[line 2 of the keys of myArray] 可能会返回 myArray[10]。
      • 还没有机会尝试这个,但我认为“myKeys 的第 3 行”正在从 mkKeys 变量中获取第三个元素(无论是什么类型),这是否正确?如果是这样,那么我想我已经明白了:) - 如果 is 是这样,那么我是否也可以“将 myArray 的第 3 行放入 myName”?
      • 您无法获得 myArrray 的第 3 行,并且由于您想按排序顺序使用数字键,因此您必须在获得第三行键之前对它们进行排序。所以,是的,myKeys 的第 3 行从 myKeys 变量中获取第三行,但这与从数组中获取第三行不同。 (另外,我不会将键列表中的一行称为元素,因为数组中的元素是键所指的内容)。
      【解决方案3】:

      您需要在数组之上实现该功能。以下是一些可能对您有所帮助的命令:

      从数组中移除已知元素的第一个实例

      command ArrayRemove @pArray,pValue
         local tRemoved = "false"
         repeat with tIndex = min(replaceText(keys(pArray),cr,comma)) to max(replaceText(keys(pArray),cr,comma))
            if tRemoved then
               put pArray[tIndex] into pArray[tIndex-1]
            else if pArray[tIndex] = pValue then
               delete variable pArray[tIndex]
               put true into tRemoved
            end if
         end repeat
         if tRemoved then
            delete variable pArray[tIndex]
         end if
      end ArrayRemove
      

      从数组中删除已知索引

      command ArrayRemoveIndex @pArray,pIndex
         repeat with tIndex = pIndex+1 to max(replaceText(keys(pArray),cr,comma))
            put pArray[tIndex] into pArray[tIndex-1]
         end repeat
         delete variable pArray[tIndex]
      end ArrayRemoveIndex
      

      请注意,这些命令也适用于队列等其他内容,因此索引可能不以 1 开头。如果您知道数组为 1..n

      ,则可以删除最大值等并替换为 the number of elements of pArray

      如果您不确定 pIndex 是否在数组的索引范围内,那么您需要对 ArrayRemoveIndex 添加一些检查

      【讨论】:

        【解决方案4】:

        戴夫。您总是必须通过键名来引用数组元素。你可以写一个小函数来做你想做的事;

        function arrayIndex @pArray, pIndex
           return pArray[line pIndex of the keys of pArray]
        end arrayIndex
        

        删除元素“3”后,您可以使用;访问元素编号3(即键“4”)

        put arrayIndex(myArray, 3) into tValue
        

        HTH :D

        【讨论】:

        • 这行不通,因为您没有对数组进行排序。你可以使用@,但你不必这样做。我觉得没有@的函数更容易理解。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多