|  13.09.2011, 13:50 | #1 | 
| Участник | Не корректная сортировка в Map-e и Set-е. AX2009 RU5 X++: static void JobSortMap(Args _args) { Map map = new Map(TYPES::String, TYPES::Real); MapIterator mit; ; map.insert('10', 0); map.insert('30', 0); map.insert('-10', 0); map.insert('-5', 0); map.insert('20', 0); map.insert('71', 0); map.insert('7-1', 0); map.insert('20-30', 0); mit = new MapIterator(map); while (mit.more()) { info(mit.key()); mit.next(); } } Результаты Job-a: AX2009: 10 -10 20 20-30 30 -5 71 7-1 Axapta 3.0: -10 -5 10 20 20-30 30 7-1 71 С Set-ами такая же хрень. Мне кажется в Axapta 3.0 сортировка более правильная. 
				__________________ -Ты в гномиков веришь? -Нет. -А они в тебя верят, смотри, не подведи их. | 
|  | |
| За это сообщение автора поблагодарили: alex55 (1), S.Kuskov (3). | |
|  13.09.2011, 14:20 | #2 | 
| Мрачный тип | 
			
			А как себя ведет MapEnumerator в таком случае ? MapIterator как-то был объявлен атавизмом ...
		 
				__________________ Мы летаем, кружимся, нагоняем ужасы ... | 
|  | 
|  13.09.2011, 14:26 | #3 | 
| Участник | Цитата:  Жаль, что испортили, неудобно. 
				__________________ -Ты в гномиков веришь? -Нет. -А они в тебя верят, смотри, не подведи их. | 
|  | 
|  13.09.2011, 14:56 | #4 | 
| Участник | 
			
			Вот ещё про символ тире: Сортировка и сравнение строк
		 | 
|  | |
| За это сообщение автора поблагодарили: Pustik (2). | |
|  13.09.2011, 15:36 | #5 | 
| Участник | 
			
			Нет. Здесь другая проблема. Символ дефиса, в данном случае, выступает как некий управляющий символ. И режим сортировки тут вообще не при чем X++: static void Job_Test(Args _args) { void comp(str _str1, str _str2) { if (_str1 > _str2) { info(_str1 + ' больше ' + _str2); } if (_str1 < _str2) { info(_str1 + ' меньше ' + _str2); } if (_str1 == _str2) { info(_str1 + ' равно ' + _str2); } } ; comp('1','-1'); comp('2','-1'); comp('10','-1'); comp('10','-2'); comp('20','-1'); comp('20','-2'); comp('20','-3'); } Получаем "1 меньше -1", но "2 больше -1" и "10 больше -1". Значит, сортировка - не при чем. Что-то другое. Последний раз редактировалось Владимир Максимов; 13.09.2011 в 15:42. | 
|  | |
| За это сообщение автора поблагодарили: Pustik (1). | |
|  13.09.2011, 16:16 | #6 | 
| Участник | 
			
			И всё-таки, видимо, всему виной collation http://www.sql.ru/forum/actualthread...d=1&tid=414232 http://www.sql.ru/forum/actualthread.aspx?tid=290618 Последний раз редактировалось S.Kuskov; 13.09.2011 в 16:33. | 
|  | 
|  13.09.2011, 17:43 | #7 | 
| Участник | 
			
			Если исходить из предположения, что это связано с collate, то порядок, приведенный в начале темы соответствует collate с названием Cyrillic_General_CI_AS. У нас на сервере настроена collate SQL_Latin1_General_CP1251_CI_AS, что дает "правильный" порядок сортировки на самом сервере Значит, Axapta использует сортировку Windows (опять же, если предположение соответствует действительности). Может, кто в курсе как это проверить? И есть ли соответствующие настройки Axapta? | 
|  | 
|  13.09.2011, 19:31 | #8 | 
| Участник | 
			
			При чем тут collate и вообще сервер базы данных если речь идет о map ? Наверное, намерено никто ничего "не портил", просто как то повлиял переход платформы на поддержку unicode. Кстати что то подобное касается и временных таблиц : сортировка в них (для Ax2009) отличается от той, что была в Ax 3.0. Видимо, причина та же что и с map. | 
|  | 
|  13.09.2011, 20:00 | #9 | 
| Участник | Цитата: Цитата: 
		
			Сообщение от Владимир Максимов
			   X++: static void Job_Test(Args _args) { void comp(str _str1, str _str2) { if (_str1 > _str2) { info(_str1 + ' больше ' + _str2); } if (_str1 < _str2) { info(_str1 + ' меньше ' + _str2); } if (_str1 == _str2) { info(_str1 + ' равно ' + _str2); } } ; comp('1','-1'); comp('2','-1'); comp('10','-1'); comp('10','-2'); comp('20','-1'); comp('20','-2'); comp('20','-3'); } Может быть есть смысл в логику его сортировки добавить количество символов в строке? 
				__________________ -Ты в гномиков веришь? -Нет. -А они в тебя верят, смотри, не подведи их. Последний раз редактировалось Pustik; 13.09.2011 в 20:03. | 
|  | 
|  13.09.2011, 20:21 | #10 | 
| Участник | 
			
			В данном случае Map - это частный случай сравнения (упорядочивания) символьных строк. Проблема касается ЛЮБЫХ вариантов сравнения символьных данных в Ax2009. Любым способом и в любом месте.   Посмотрите мой пример. Там нет никаких объектов. Банальное "в лоб" сравнение символьных строк вида (str1 > str2). Тем не менее, наблюдается та же проблема. При этом тот порядок сортировки (правила сравнения на больше/меньше), который в результате получается, идеально совпадает с тем порядком сортировки, который получается при collate с именем Cyrillic_General_CI_AS | 
|  | 
|  13.09.2011, 20:39 | #11 | 
| Участник | Цитата: (спасибо за пример) Как победить?А если многие алгоритмы зависят от правильной сортировки?Менять тире на какой-нибудь хитрый символ(типа ###)? Эх, считаю , что это баг! 
				__________________ -Ты в гномиков веришь? -Нет. -А они в тебя верят, смотри, не подведи их. Последний раз редактировалось Pustik; 13.09.2011 в 20:44. | 
|  | 
|  14.09.2011, 09:04 | #12 | 
| Участник | 
			
			В трешке при сравнении строк используется String sort, а в 2009-й (и в четверке, по-видимому) Word sort В сортировке символов все нецифро-буквенные символы имеют меньшее значение, чем любая цифра или буква и оказываются всегда впереди В сортировке слов апостроф и дефис сортируются так, что-бы одинаковые слова, разделенные ими, стояли рядом. Т.е. при сравнении рассмотривается не только сам этот символ, но и следующие за ним По-этому, '12' > '1-1', а '10' < '1-1'. Что касается сравнения '11' и '1-1', то тут уже, по-моему, имеет значение так же длина строки. Т.е. '11' < '1-1'. Эксперименты с различными кодировками (включая китайские, арабские и японские) не влияли на результаты сравнения А вот сравнение '11-' и '1-1' выявило разные результаты (причем и для трешки и для 2009-й) на WinXP ('11-' > '1-1') и на Win7/2008R2 ('11-' < '1-1') для одной и той же кодировки. Тут либо разная реализация функций сравнения в разных версиях винды, либо разные настройки локалей 
				__________________ Axapta v.3.0 sp5 kr2 | 
|  | |
| За это сообщение автора поблагодарили: sukhanchik (4), Logger (5), gl00mie (5). | |
|  03.05.2016, 21:28 | #13 | 
| Участник | Цитата: 
		
			Сообщение от AndyD
			   В трешке при сравнении строк используется String sort, а в 2009-й (и в четверке, по-видимому) Word sort В сортировке символов все нецифро-буквенные символы имеют меньшее значение, чем любая цифра или буква и оказываются всегда впереди В сортировке слов апостроф и дефис сортируются так, что-бы одинаковые слова, разделенные ими, стояли рядом. Т.е. при сравнении рассмотривается не только сам этот символ, но и следующие за ним По-этому, '12' > '1-1', а '10' < '1-1'. http://stackoverflow.com/questions/3...or-string-sort | 
|  | 
| Теги | 
| ax2009, map, set, сортировка | 
|  | 
| 
 |