Привести один массив к другому
Есть два массива (вектора), с одним работаем, другой служит как образец. Все элементы в каждом массиве могут встречаться только один раз. Необходимо "рабочий" массив сделать точно таким же, как образцовый, т.е. поменять местами некоторые элементы, некоторые добавить, некоторые удалить. На добавление/удаление при этом вызвать коллбек.
Сначала все удалить, потом по порядку добавить, ума много не надо. Но вот как реализовать все это красиво и в минимальное число проходов? Для примера: Код AS3:
|
Для простого массива со строками или числами можно сделать рас:
Код AS3:
Код AS3:
Для сложных массивов (для массивов с массивами или массивов с объектами) адоб предлагает использовать следующую функцию: Код AS3:
http://help.adobe.com/en_US/ActionSc...0204-7ee7.html Проверка методов клонирования массивов на скорость: http://flashlabs.wordpress.com/2009/...cat-or-slice0/ Если лень: slice - 30ms concat - 13ms clone - 230ms |
Код AS3:
Код AS3:
Ну, или так: Код AS3:
|
Код AS3:
|
это вы ссылки приравняли
|
Ключевой момент тут:
Цитата:
Решение в лоб: сначала найти элементы одного, отсутствующие в другом, и наоборот, вызвать для каждого соответствующую функцию, потом уже изменить массив, но этого я хотел избежать. Ночью приснилось, как решить это рекурсивно. Вот что набросал на Питоне: Код:
def added_handler(element, index): Код:
element '19' moved to index 1 По-моему, это достаточно полезная функция, когда можно узнать, что именно изменять во вьюхе при произвольном изменении модели, вместо того, чтобы инициализировать все подряд. |
Ну начнем с того, что ваша программа некорректна.
Код:
source = [18, 19, 1, 2, 4, 6, 8, 32, 3, 200, 42, 12, 99] Код:
def addedHandler(element): Ну допустим, есть [1, 2, 3] и [4, 3, 2]. Это что? Код:
1 removed at 0 Код:
1 removed at 0 |
Читайте про расстояния (Levenshtein distance, Hamming distance и т.д.)
Вам сначала нужно определится с тем, что именно вы хотите отследить, а потом уже это реализовывать. Например, в случае с заменами, как вы их отличите от перемещения? А если есть несколько одинаковых элементов? На эти вопросы нет однозначного ответа, нужно просто выбрать консистентую стратегию, и ей следовать. |
Нужно было отследить элементы одного массива, отсутствующие в другом в обоих направлениях, а для тех, что есть в двух массивах, найти те, что имеют различные индексы, повторяющихся элементов при этом быть не должно по условию. Порядок вызовов onAdded/onRemoved/onMoved не важен. Затем привести массив к виду образца. Я искал, как сделать это все сразу, и в принципе, моя реализация выше (код исправил) этому соответствует. Другое дело, насколько этот подход оправдан и эффективен. Возможно, лучше действительно не городить огород, а последовательно сравнить индексы и изменить массив.
|
Часовой пояс GMT +4, время: 18:26. |
Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.