【问题标题】:Cleanly merge two arrays in ActionScript (3.0)?在 ActionScript (3.0) 中干净地合并两个数组?
【发布时间】:2010-09-25 00:34:42
【问题描述】:

在 ActionScript(特别是 ActionScript 3.0)中合并两个排序数组的好方法是什么?生成的数组应该排序并且没有重复。

【问题讨论】:

    标签: actionscript-3 arrays actionscript merge


    【解决方案1】:

    要合并(连接)数组,请使用.concat()

    以下是如何连接数组并同时删除重复项的两个示例。

    更便捷的方式:(可以使用as3corelib中的ArrayUtil.createUniqueCopy()

    // from as3corelib:
    import com.adobe.utils.ArrayUtil;
    
    var a1:Array = ["a", "b", "c"];
    var a2:Array = ["c", "b", "x", "y"];
    
    var c:Array = ArrayUtil.createUniqueCopy(a1.concat(a2)); // result: ["a", "b", "c", "x", "y"]
    

    稍微快一点的方法:(您可以自己循环遍历数组并使用Array.indexOf() 来检查重复项)

    var a1:Array = ["a", "b", "c"];
    var a2:Array = ["c", "b", "x", "y"];
    var a3:Array = ["a", "x", "x", "y", "z"];
    
    var c:Array = arrConcatUnique(a1, a2, a3); // result: ["a", "b", "c", "x", "y", "z"]
    
    private function arrConcatUnique(...args):Array
    {
        var retArr:Array = new Array();
        for each (var arg:* in args)
        {
            if (arg is Array)
            {
                for each (var value:* in arg)
                {
                    if (retArr.indexOf(value) == -1)
                        retArr.push(value);
                }
            }
        }
        return retArr;
    }
    

    【讨论】:

    • 他要求一个“好”的方式... :)
    • 好的,也许我添加到答案中的另一种方式可以被认为是“更好”
    【解决方案2】:

    这是一种简单的算法。如果在 Actionscript 中有更直接的方法可以做到这一点,我会感到惊讶。

    function merge(a1:Array, a2:Array):Array {
        var result:Array = [];
        var i1:int = 0, i2:int = 0;
    
        while (i1 < a1.length && i2 < a2.length) {
            if (a1[i1] < a2[i2]) {
                result.push(a1[i1]);
                i1++;
            } else if (a2[i2] < a1[i1]) {
                result.push(a2[i2]);
                i2++;
            } else {
                result.push(a1[i1]);
                i1++;
                i2++;
            }
        }
    
        while (i1 < a1.length) result.push(a1[i1++]);
        while (i2 < a2.length) result.push(a2[i2++]);
    
        return result;
    }
    

    【讨论】:

      【解决方案3】:
      function remDuplicates(_array:Array):void{
          for (var i:int = 0; i < _array.length;++i) {
              var index:int = _array.indexOf(_array[i]);
              if (index != -1 && index != i) {
                  _array.splice(i--, 1);
              }
          }
      }
      

      然后对于“合并”使用 concat。 例子:

      var testArray:Array = [1, 1, 1, 5, 4, 5, 5, 4, 7, 2, 3, 3, 6, 5, 8, 5, 4, 2, 4, 5, 1, 2, 3, 65, 5, 5, 5, 5, 8, 4, 7];
      var testArray2:Array = [1, 1, 1, 5, 4, 5, 5, 4, 7, 2, 3, 3, 6, 5, 8, 5, 4, 2, 4, 5, 1, 2, 3, 65, 5, 5, 5, 5, 8, 4, 7];
      
      testArray.concat(testArray2);
      trace(testArray);
      remDuplicates(testArray);
      trace(testArray);
      

      【讨论】:

        【解决方案4】:

        如果您有一个包含大量元素的 List,使用 Array.indexOf 检测重复项将会非常缓慢;删除重复项的一种更快的方法是在连接它们之后将 Array 的内容放入 Set 中。

        // Combine the two Arrays.
        const combined : Array = a.concat(b);
        
        // Convert them to a Set; this will knock out all duplicates.
        const set : Object = {};  // use a Dictionary if combined contains complex types.
        
        const len : uint = combined.length;
        for (var i : uint = 0; i < len; i++) {
            set[combined[i]] = true;
        }
        
        // Extract all values from the Set to produce the final result.
        const result : Array = [];
        for (var prop : * in set) {
            result.push[prop];
        }
        

        如果您的程序大量使用 Collections,那么使用众多 AS3 Collections 框架之一可能是明智的,这些框架提供了一个简单的接口来操作数据,并且在实现时总是采用最佳方法.

        【讨论】:

        • 非常整洁,谢谢。 result.push[prop] 的错误。应该是result.push(prop)
        【解决方案5】:

        请按照以下步骤获取答案:

        1. 使用“Concat”方法连接两个数组。
        2. 使用数组类中作为 API 提供的“排序”方法的新数组(连接)排序
        3. 制作用户定义的函数以删除重复项(见下面的函数)
        4. > 函数 removeDuplicates(p_arr:Array):Array {
           var ansArr:Array = new Array();
           var len:uint = p_arr.length;
           var i:uint = 0;
           var j:uint = 0;
           ansArr[j] = p_arr[i];
           i++;
           j++;
           while(i<len)
           {
              if(ansArr[j] != p_arr[i])
              { 
                ansArr[j] = p_arr[i];
                j++;
              }
              i++;
           }
           return ansArr;
          

          }

        返回的 "ansArr" 将被排序并且没有重复的两个数组的合并数组。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-07-23
          • 2021-07-23
          • 2018-06-20
          • 2022-01-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-08-04
          相关资源
          最近更新 更多