AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
DAX
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск Все разделы прочитаны

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 23.11.2010, 09:31   #1  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2499 (89) +++++++++
Регистрация: 20.08.2005
Сергей, достаточно просто пробежать по полученным множествам
X++:
{
...
    set1 = Set::difference(_setOfValues2Replace, _setOfNewValues);
    set2 = Set::difference(_setOfNewValues, _setOfValues2Replace);
    sEnum1 = set1.getEnumerator();
    sEnum2 = set2.getEnumerator();
    while (sEnum.moveNext())
    {
        if (sEnum1.moveNext())
            ret.addEnd([sEnum.current(), sEnum1.current()]);
    }
    return ret;
}
Для множеств из примера, у gl00mie получается такая замена
1->2, 3->1, 7->3, 0->4, 9->5, 15->6, 20->7
Для такой замены
0->2, 9->4, 15->5, 20->6
__________________
Axapta v.3.0 sp5 kr2
За это сообщение автора поблагодарили: mazzy (2), gl00mie (5).
Старый 23.11.2010, 09:39   #2  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от AndyD Посмотреть сообщение
Сергей, достаточно просто пробежать по полученным множествам
или так

я предполагал, что еще можно выполнить следующую оптимизацию: минимизировать число замен (число операций с БД).

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

но взглянув на это дело с утра (и после подсказки gl00mie о том, что difference - за циклом),
понял, что минимизировать нечего - все мертвенькие значения из deadSet так или иначе должны быть заменены.

поэтому соглашусь - цикл проще.
__________________
полезное на axForum, github, vk, coub.
Старый 23.11.2010, 15:46   #3  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Что-то задело меня.
Можно еще чуть пооптимизировать
X++:
{
...
    seedSet = Set::difference( newSet, oldSet ); // зародыши: новые значения будут браться отсюда
    if( seedSet.empty() )
        return ret; // не на что менять - поэтому ничего менять не нужно (gl00mie)

    deadSet = Set::difference( oldSet, newSet ); // мертвенькие: они исчезнут
    seedEnum = seedSet.getEnumerator();
    deadEnum = deadSet.getEnumerator();
    while ( deadEnum.moveNext() )
    {
        if ( !seedEnum.moveNext() )
            break; // чтобы не бегать в цикле лишний раз, если в зародышах ничего не осталось

        ret.addEnd([deadEnum.current(), seedEnum.current()]);
    }
    return ret;
}
__________________
полезное на axForum, github, vk, coub.
Старый 23.11.2010, 18:26   #4  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
X++:
{
...
    seedSet = Set::difference( newSet, oldSet ); // зародыши: новые значения будут браться отсюда
    if( seedSet.empty() )
        return ret; // не на что менять - поэтому ничего менять не нужно (gl00mie)

    deadSet = Set::difference( oldSet, newSet ); // мертвенькие: они исчезнут

    seedEnum = seedSet.getEnumerator();
    deadEnum = deadSet.getEnumerator();
    while ( deadEnum.moveNext() && seedEnum.moveNext() )
    {
        ret.addEnd([deadEnum.current(), seedEnum.current()]);
    }
    return ret;
}
Вот теперь - хорошо.
__________________
полезное на axForum, github, vk, coub.
Старый 24.11.2010, 15:05   #5  
Wamr is offline
Wamr
----------------
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
1,737 / 868 (32) +++++++
Регистрация: 15.01.2002
Адрес: Москва
Записей в блоге: 7
вариант
парадоксально простой алгоритм получается, если пытаться сохранить сортировку старых элементов.
X++:
    ret = new List( Types::Container );

    setIterOld = new SetIterator( _setOfValues2Replace );
    setIterNew = new SetIterator( _setOfNewValues );

    while (setIterNew.more() && setIterOld.more())
    {
        if (setIterOld.value() > setIterNew.value())
        {
            ret.addEnd( [ setIterOld.value(), setIterNew.value() ] );
        }
        else if (setIterOld.value() < setIterNew.value())
        {
            ret.addStart( [ setIterOld.value(), setIterNew.value() ] );
        }

        setIterNew.next();
        setIterOld.next();
    }

    return ret;
За это сообщение автора поблагодарили: mazzy (5), gl00mie (5).
Теги
законченный пример, уникальность

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Универсальный изменятель значений полей wojzeh DAX: Программирование 17 26.09.2013 17:47
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра
Комбинированный вид Комбинированный вид

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 20:39.