Есть ли более эффективный способ сравнения двух массивов в AS3 для добавления, удаления и обновления? - PullRequest
3 голосов
/ 13 апреля 2010

Мне интересно, есть ли лучший способ приблизиться к этому, чем мое текущее решение ...

У меня есть список предметов, затем я получаю другой список предметов. Мне нужно сравнить два списка и составить список существующих элементов (для обновления), список, которых нет в новом списке (для удаления), и список элементов, которых нет в старом списке. (для добавления).

Вот что я сейчас делаю - в основном создаю объект поиска для проверки, существует ли элемент. Спасибо за любые советы.

            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 голосов
/ 13 апреля 2010

Если вы должны сделать это, то, вероятно, лучше подходит Михаэль (хотя он все равно будет довольно медленным, если его часто запускать или для больших массивов). Также потребуется небольшое изменение, чтобы дать вам массив only_in_array1, так как array1_presence_dictionary - это объект, а не массив. И так как вы не будете использовать array1_presence_dictionary позже, вы можете изменить строку array1_presence_dictionary[item] = item; на array1_presence_dictionary[item.itemNumber] = true;

На самом деле, теперь, когда я смотрю на код, есть немало мелких ошибок, таких как приведение элемента к строке, в результате чего получается ключ [Object Class_Of_Item], который не является уникальным, и т. Д. Но это всего лишь небольшие проблемы. и не влияет на ответ.

Лучший способ - это изменить дизайн, если это возможно. Либо создайте 3 разных массива для добавления, обновления, удаления или для элемента, создайте переменную состояния, которая будет обновлена, чтобы сообщить, что необходимо сделать, и вы можете просмотреть только один раз, проверяя item.status. Есть много альтернатив.

0 голосов
/ 13 апреля 2010

Вместо использования Array , который требует O (n) времени, чтобы определить, присутствует ли значение, вы должны использовать 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];.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...