是否有更高效的AS3方式来比较2个阵列的添加,删除&更新?

时间:2010-04-13 00:18:33

标签: flash actionscript-3 arrays

我想知道是否有比现有解决方案更好的方法来解决这个问题......

我有一个项目列表,然后我检索另一个项目列表。我需要比较两个列表,并提供一个现有项目列表(用于更新),新列表中不存在的列表(用于删除)以及旧列表中不存在的项目列表(用于添加)。

以下是我现在正在做的事情 - 基本上创建一个查找对象,用于测试项目是否存在。感谢您的任何提示。

            for each (itm in _oldItems)
        {
            _oldLookup[itm.itemNumber] = itm;
        }

        // Loop through items and check if they already exist in the 'old' list
        for each (itm in _items)
        {
            // If an item exists in the old list - push it for update
            if (_oldLookup[itm.itemNumber])
            {
                _itemsToUpdate.push(itm);
            }
            else // otherwise push it into the items to add
            {
                _itemsToAdd.push(itm);
            }

            // remove it from the lookup list - this will leave only
            // items for removal remaining in the lookup
            delete _oldLookup[itm.itemNumber];
        }

        // The items remaining in the lookup object have neither been added or updated - 
        // so they must be for removal  - add to list for removal
        for each (itm in _oldLookup)
        {
            _itemsToRemove.push(itm);
        }

2 个答案:

答案 0 :(得分:0)

不是使用需要O(n)时间来确定某个值是否存在的Array,而是应使用Object,这样可以提供更好的性能(O(1)或者O(log n)平均每次查询,具体取决于它们是在实现中使用哈希映射还是树。所以,作为一个例子:

var array1 : Array = // ... first array
var array2 : Array = // ... second array

// Build up dictionary of items in array1
var array1_presence_dictionary : Object = new Object();
for each (var item : * in array1 ){
    array1_presence_dictionary[item] = item;
}

// Iterate over array2, constructing list of common and not common elements
var both : Array = new Array();
var only_in_array2 : Array = new Array();
for each (var item : * in array2 ){
      var key : String = String(item);
      if ( array1_presence_dictionary.hasOwnObject(key) ){
          both.push(item);
      }else{
          only_in_array2.push(item);
      }
}

请注意,如果您经常这样做,就像您真的希望拥有Set实现一样,那么您只需将所有值存储在ObjectDictionary中。这将确保不重复元素...您只需通过分配dict[item]=item;添加元素,然后使用del dict[item];删除。

答案 1 :(得分:0)

如果你必须这样做,那么迈克尔的方式可能是最好的(尽管如果经常运行或大型阵列它仍然会很慢)。它还需要一个小的改动来给你数组only_in_array1,因为array1_presence_dictionary是一个对象而不是一个数组。由于您稍后不会使用array1_presence_dictionary,因此您可以将行array1_presence_dictionary[item] = item;更改为array1_presence_dictionary[item.itemNumber] = true;

实际上,现在我看一下代码,有很多小错误,例如将项目转换为String,导致键[Object Class_Of_Item]不是唯一的等等。但这些只是小问题并不影响答案。

最好的方法是尽可能改变设计。创建3个不同的数组以进行添加,更新,删除,或者为项创建一个变量状态,该状态将更新以说明需要完成的操作,并且只需检查item.status就可以循环。有很多选择。