|
![]() |
#1 |
Участник
|
Цитата:
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, и о чувствительности к языку |
|
![]() |
#2 |
Участник
|
ГЫ! 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 ошибка!!!!! } ... ![]() буду признателен, если кто подскажет |
|
![]() |
#3 |
Участник
|
ГЫ! Даже если нет контейнеров, то порядок установленный при помощи 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; // результат зависит от языка, в котором работает пользователь } ... ![]() буду ОЧЕНЬ признателен, если кто подскажет. Не то, чтобы это было нужно. Но интересножеж. ![]() |
|
![]() |
#4 |
Участник
|
Цитата:
![]() А если серьёзно, то в чём смысл сортировки ради сортировки? Можно конечно расматривать упорядоченный контейнер как некую его хеш-функцию, котрую потом можно использовать для определения эквивалентности контейнеров. Но решить данную задачу можно и более простыми, и главное более оптимальными способами. Итого. Считаю возможным решать задачу сортировки разнородных данных, только в контексте конкретной задачи. Тогда выбор методики сравнения будет зависеть от самой задачи, и вообще говоря не будет универсальным, подходящим для других задач. Если говорить о создании универсального инструмента сортировки контейнера, то универсальным выходом может быть передача предиката сравнения в качестве входного параметра алгоритму сортировки. Как это реализовать в аксапте - уже другой вопрос Передача функции в качестве параметра |
|
|
За это сообщение автора поблагодарили: mazzy (2). |
![]() |
#5 |
Участник
|
Разбор моих грехов
Оставьте до поры Вы оцените красоту игры (С) ![]() |
|
|
Опции темы | Поиск в этой теме |
Опции просмотра | |
|