|
|
|
|
#1 |
|
Участник
|
Сергей, достаточно просто пробежать по полученным множествам
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;
}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). | |
|
|
#2 |
|
Участник
|
или так
![]() я предполагал, что еще можно выполнить следующую оптимизацию: минимизировать число замен (число операций с БД). чтобы минимизировать, скорее всего, понадобится более интеллектуальный алгоритм, нежели moveNext(). поэтому я оставил псевдокод anyValue(). но взглянув на это дело с утра (и после подсказки gl00mie о том, что difference - за циклом), понял, что минимизировать нечего - все мертвенькие значения из deadSet так или иначе должны быть заменены. поэтому соглашусь - цикл проще. |
|
|
|
|
#3 |
|
Участник
|
Что-то задело меня.
Можно еще чуть пооптимизировать 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;
} |
|
|
|
|
#4 |
|
Участник
|
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;
} |
|
|
|
|
#5 |
|
----------------
|
вариант
парадоксально простой алгоритм получается, если пытаться сохранить сортировку старых элементов.
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). | |
| Теги |
| законченный пример, уникальность |
|
|
Похожие темы
|
||||
| Тема | Ответов | |||
| Универсальный изменятель значений полей | 17 | |||
| Опции темы | Поиск в этой теме |
| Опции просмотра | |
|