我想知道是否有比现有解决方案更好的方法来解决这个问题......
我有一个项目列表,然后我检索另一个项目列表。我需要比较两个列表,并提供一个现有项目列表(用于更新),新列表中不存在的列表(用于删除)以及旧列表中不存在的项目列表(用于添加)。
以下是我现在正在做的事情 - 基本上创建一个查找对象,用于测试项目是否存在。感谢您的任何提示。
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);
}
答案 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实现一样,那么您只需将所有值存储在Object或Dictionary中。这将确保不重复元素...您只需通过分配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就可以循环。有很多选择。