22.04.2011, 04:14 | #1 |
Участник
|
dax-lessons: Sort a container [using X++ , Dynamics AX]
Источник: http://dynamicsaxgyan.wordpress.com/...x-dynamics-ax/
============== Friends, Recently I was in need of sorting the elements in the container and use them . I am not sure how far this code is helpful to you guys. Below code will help to sort the elements in the … Continue reading → X++: static void SR_sortContainer(Args _args) { container con = [5,1,2,'Sumit Loya',9, 'Ashish singh', NoYes::No]; str temp1; str temp2; int i; int j; container sorCon; ; sorCon = con; // Sort the container for (i = 1; i <= conlen(sorCon); i++) { for (j = i + 1; j <= conlen(sorCon); j++) { temp1 = conpeek(sorCon, j); temp2 = conpeek(sorCon, i); if (temp1 < temp2) { sorCon = condel(sorCon, j, 1); sorCon = conins(sorCon, j, temp2); sorCon = condel(sorCon, i, 1); sorCon = conins(sorCon, i, temp1); } } } conview(sorCon); }
__________________
Расскажите о новых и интересных блогах по Microsoft Dynamics, напишите личное сообщение администратору. Последний раз редактировалось Poleax; 22.04.2011 в 10:45. |
|
22.04.2011, 07:25 | #2 |
Участник
|
что-то все больше разочаровываюсь в этих уроках, в этом блоге и в этом авторе-консультанте.
для сортировки использует метод пузырька. бог с ним, может с методической точки зрения хочет показать работу с контейнером, и не хочет усложнять демонстрационный пример сложностью алгоритмов. но почему этот чел, использует связку condel+conins вместо одного conpoke? загадка! и почему этот чел объявил временные переменные как строки "str temp1;", а не как anytype! у него же "отсортированный" контейнер будет содержать совсем другие значения. убрать что-ли этот блог из импорта на аксфорум... |
|
22.04.2011, 08:27 | #3 |
Участник
|
Anytype остается anytype'ом ровно до того момента, пока ему не присвоят определенное значение. Дальше он будет иметь тот тип, которым его инициализировали. И при дальнейших присвоениях будет происходить конвертация в этот первоначальный тип.
Что не всегда возможно, либо не всегда корректно. Внутренняя ошибка номер 25 в сценарии SQL Да и сравнивать надо значения одно типа (или сравниваемых, типа int и real). Потому как сказать, что больше или меньше 2 или 'Sumit Loya' невозможно. Да и что даст такое сравнение - то же непонятно. Что касается основного вопроса - на блоге есть возможность оставить отзыв. Надо строго его предупредить, что если продолжит в том же духе, то будет исключен и забыт на аксфоруме. Пусть одумается, пока не поздно
__________________
Axapta v.3.0 sp5 kr2 |
|
22.04.2011, 08:43 | #4 |
Участник
|
Цитата:
вот об этом и надо было написать. а так получилась полная фигня. Цитата:
вопрос - нужно ли такое на аксфоруме. |
|
22.04.2011, 09:14 | #5 |
Участник
|
Цитата:
X++: static void sortContainer(Args _args) { container con = [5,1,2,'Sumit Loya',9, 'Ashish singh', NoYes::No]; int len = conlen(con); // вычисляем только один раз! int i; int j; // принимаем значения любого типа // однако сравниваем как строки! int cmp(anytype a, anytype b) { // Здесь конечно надо бы возвращать три значения 1; 0; -1 // но раз уж используем метод пузырька, // упрощаем не сильно заморачиваясь по поводу производительности // главное - методика сравнение двух anytype значений return(SysQuery::value(a) > SysQuery::value(b) ) ? 1 : -1; // дает runtime error если внутри контейнера есть контейнер! // дает разные результаты, если выполняется в среде с разными языками } // меняем местами значения внутри контейнера void swapIf(int _i, int _j) { anytype a = conpeek(con, _i); // значения с типом anytype примут тип при первой инициализации anytype b = conpeek(con, _j); // повторные присваивания уже не изменят тип переменной anytype, // поэтому обмен приходится делать в локальном методе if( cmp(a, b) > 0 ) { con = conpoke(con, _j, a); con = conpoke(con, _i, b); } } ; conview(Con,"con: before"); // Sort the container for (i = 1; i < len; ++i) { for (j = i + 1; j <= len; ++j) { swapif(i, j); } } conview(Con,"con: after"); } Последний раз редактировалось mazzy; 22.04.2011 в 10:33. Причина: добавил инфу о runtime error, и о чувствительности к языку |
|
22.04.2011, 09:22 | #6 |
Участник
|
ГЫ! SysQuery::value() ругается, если будут вложенные контейнеры!
X++: static void sortContainer(Args _args) { container con = [5,1,2,'Sumit Loya',9, ['inner container', 'with', 4, 'values'],'Ashish singh', NoYes::No]; ... int cmp(anytype a, anytype b) { return(SysQuery::value(a) > SysQuery::value(b) ) ? 1 : -1; // runtime ошибка!!!!! } ... буду признателен, если кто подскажет |
|
22.04.2011, 09:25 | #7 |
Участник
|
Цитата:
но делать condel+conins - это маразм. даже для учебных примеров. а возвращать обратно в контейнер строки вместо исходных значений - это грубая ошибка. тем более в учебных примерах. |
|
22.04.2011, 09:38 | #8 |
Участник
|
ГЫ! Даже если нет контейнеров, то порядок установленный при помощи SysQuery::value зависит от используемого языка!
так в русском NoYes::No сортируется как слово "Нет", а при английском языке сортируется как слово "No" X++: static void sortContainer(Args _args) { container con = [5,1,2,'Sumit Loya',9,'Ashish singh', NoYes::No]; ... int cmp(anytype a, anytype b) { return(SysQuery::value(a) > SysQuery::value(b) ) ? 1 : -1; // результат зависит от языка, в котором работает пользователь } ... буду ОЧЕНЬ признателен, если кто подскажет. Не то, чтобы это было нужно. Но интересножеж. |
|
22.04.2011, 10:14 | #9 |
Участник
|
Цитата:
А если серьёзно, то в чём смысл сортировки ради сортировки? Можно конечно расматривать упорядоченный контейнер как некую его хеш-функцию, котрую потом можно использовать для определения эквивалентности контейнеров. Но решить данную задачу можно и более простыми, и главное более оптимальными способами. Итого. Считаю возможным решать задачу сортировки разнородных данных, только в контексте конкретной задачи. Тогда выбор методики сравнения будет зависеть от самой задачи, и вообще говоря не будет универсальным, подходящим для других задач. Если говорить о создании универсального инструмента сортировки контейнера, то универсальным выходом может быть передача предиката сравнения в качестве входного параметра алгоритму сортировки. Как это реализовать в аксапте - уже другой вопрос Передача функции в качестве параметра |
|
|
За это сообщение автора поблагодарили: mazzy (2). |
22.04.2011, 10:17 | #10 |
Участник
|
Разбор моих грехов
Оставьте до поры Вы оцените красоту игры (С) |
|
|
|