purebasic.info

PureBasic forum
Текущее время: Вт янв 16, 2018 8:34 pm

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 13 ] 
Автор Сообщение
 Заголовок сообщения: Сортировка русского текста
СообщениеДобавлено: Сб июл 12, 2014 1:00 pm 
Не в сети
док

Зарегистрирован: Чт ноя 22, 2007 8:03 pm
Сообщений: 165
Откуда: Питер
Благодарил (а): 3 раз.
Поблагодарили: 1 раз.
Пункты репутации: 0
Это только у меня проблемы с сортировкой русского текста функциями SortArray и SortStructuredArray или это баг PB такой?
В неюникодном приложении сортировка, можно сказать, вообще не происходит (точнее сортирует по длине строки). В юникодном приложении получше, но не работает сортировка без учёта регистра. Приходится извращаться и держать строки в массиве структур - один элемент нужная строка, другой элемент - строка в верхнем регистре для сортировки (это не всегда даёт правильную сортировку когда значения строк в верхнем регистре совпадают, но мне нужно для сортировки имён файлов и это пока прокатывает).
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
EnableExplicit
 
Structure FF
        name.s
        uname.s
EndStructure
 
Define i.i
Define Dim s.s(7), Dim fs.ff(7)
s(0) = "йцукен-0"
s(1) = "ЙЦУКЕН-1"
s(2) = "апролджэ-2"
s(3) = "АПРОЛДЖЭ-3"
s(4) = "БЮ-4"
s(5) = "бю-5"
s(6) = "ААА-6"
s(7) = "ааа-7"
For i=0 To ArraySize(fs())
        fs(i)\name = s(i)
        fs(i)\uname = UCase(s(i))
Next
SortArray(s(),#PB_Sort_Ascending|#PB_Sort_NoCase)
Debug s(0)
Debug s(1)
Debug s(2)
Debug s(3)
Debug s(4)
Debug s(5)
Debug s(6)
Debug s(7)
Debug ""
SortStructuredArray(fs(),#PB_Sort_Ascending,OffsetOf(FF\uname),#PB_String)
Debug fs(0)\name
Debug fs(1)\name
Debug fs(2)\name
Debug fs(3)\name
Debug fs(4)\name
Debug fs(5)\name
Debug fs(6)\name
Debug fs(7)\name
Debug ""
 



Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Сортировка русского текста
СообщениеДобавлено: Сб июл 12, 2014 1:20 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11077
Благодарил (а): 4 раз.
Поблагодарили: 384 раз.
Одинаково сортирует ASCII и юникодный вариант проги.

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Сортировка русского текста
СообщениеДобавлено: Сб июл 12, 2014 1:25 pm 
Не в сети
док

Зарегистрирован: Чт ноя 22, 2007 8:03 pm
Сообщений: 165
Откуда: Питер
Благодарил (а): 3 раз.
Поблагодарили: 1 раз.
Пункты репутации: 0
Сортирует нормально с учётом #PB_Sort_NoCase?

PureBasic 5.11


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Сортировка русского текста
СообщениеДобавлено: Сб июл 12, 2014 1:39 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11077
Благодарил (а): 4 раз.
Поблагодарили: 384 раз.
В обоих случаях, в отладочном окне такие данные.
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
ААА-6
АПРОЛДЖЭ-3
БЮ-4
ЙЦУКЕН-1
ааа-7
апролджэ-2
бю-5
йцукен-0
 
ААА-6
ааа-7
апролджэ-2
АПРОЛДЖЭ-3
БЮ-4
бю-5
йцукен-0
ЙЦУКЕН-1


_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Сортировка русского текста
СообщениеДобавлено: Сб июл 12, 2014 1:43 pm 
Не в сети
PureBasic Coder
Аватар пользователя

Зарегистрирован: Чт ноя 10, 2011 10:50 am
Сообщений: 4049
Откуда: Ростов-на-Дону
Благодарил (а): 70 раз.
Поблагодарили: 80 раз.
Пункты репутации: 24
Цитата:
ААА-6
ааа-7
апролджэ-2
АПРОЛДЖЭ-3
БЮ-4
бю-5
йцукен-0
ЙЦУКЕН-1
Глядя на результат данной сортировки, сложно сказать, какая буква имеет приоритет - маленькая или большая

_________________
Пурик - лучший язык программирования


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Сортировка русского текста
СообщениеДобавлено: Сб июл 12, 2014 2:10 pm 
Не в сети
док

Зарегистрирован: Чт ноя 22, 2007 8:03 pm
Сообщений: 165
Откуда: Питер
Благодарил (а): 3 раз.
Поблагодарили: 1 раз.
Пункты репутации: 0
Никита Однороб писал(а):
Глядя на результат данной сортировки, сложно сказать, какая буква имеет приоритет - маленькая или большая

Имхо, в спорных случаях раньше должны идти заглавные буквы (в соответствии с кодом символа). Встроенная сортировка PureBasic, похоже, никакого приоритета не соблюдает. И #PB_Sort_NoCase для национальных символов игнорирует. Увы...


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Сортировка русского текста
СообщениеДобавлено: Сб июл 12, 2014 2:21 pm 
Не в сети
PureBasic Coder
Аватар пользователя

Зарегистрирован: Чт ноя 10, 2011 10:50 am
Сообщений: 4049
Откуда: Ростов-на-Дону
Благодарил (а): 70 раз.
Поблагодарили: 80 раз.
Пункты репутации: 24
Сделай пользовательскую сортировку. Подробнее тут почитай: viewtopic.php?f=8&t=3833

_________________
Пурик - лучший язык программирования


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Сортировка русского текста
СообщениеДобавлено: Сб июл 12, 2014 3:08 pm 
Не в сети
док

Зарегистрирован: Чт ноя 22, 2007 8:03 pm
Сообщений: 165
Откуда: Питер
Благодарил (а): 3 раз.
Поблагодарили: 1 раз.
Пункты репутации: 0
Видел ту тему и уже думал об этом. Тут всё упирается в написание функции, сравнивающей две строки без учёта регистра, с приритетом заглавных букв.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Сортировка русского текста
СообщениеДобавлено: Сб июл 12, 2014 3:27 pm 
Не в сети
док

Зарегистрирован: Чт ноя 22, 2007 8:03 pm
Сообщений: 165
Откуда: Питер
Благодарил (а): 3 раз.
Поблагодарили: 1 раз.
Пункты репутации: 0
Интересный момент. Дай, думаю, сделаю двойную сортировку в своём тесте, первый по полю name, второй по полю uname. При первой отсортируется по алфавиту без учёта регистра, заглавные буквы в начале. Ок, так и просходит. Вторая сортировка, по идеет, должна выдать долгожданный результат - по алфавиту, без учёта регистра, заглавные перед строчными... А вот фиг! Результат отличается от первого, но тоже неправильный. Заставляет задуматься, что же там за алгоритм используется?
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
ААА
ааа
апролджэ
АПРОЛДЖЭ
БЮ
бю
йцукен
ЙЦУКЕН
 
 
ааа
ААА
АПРОЛДЖЭ
апролджэ
бю
БЮ
йцукен
ЙЦУКЕН
 
 


(цифры убрал, цифры были нужны в связи с тем, что окно DebugOutput русские буквы не отображает.)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Сортировка русского текста
СообщениеДобавлено: Сб июл 12, 2014 3:35 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11077
Благодарил (а): 4 раз.
Поблагодарили: 384 раз.
Smitis писал(а):
ифры убрал, цифры были нужны в связи с тем, что окно DebugOutput русские буквы не отображает.)
Отображает. ОС какая?

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Сортировка русского текста
СообщениеДобавлено: Сб июл 12, 2014 3:42 pm 
Не в сети
док

Зарегистрирован: Чт ноя 22, 2007 8:03 pm
Сообщений: 165
Откуда: Питер
Благодарил (а): 3 раз.
Поблагодарили: 1 раз.
Пункты репутации: 0
Win7 x64. Интерфейс русский. Дефолтная страница для неюникодных программ 1251.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Сортировка русского текста
СообщениеДобавлено: Сб июл 12, 2014 11:43 pm 
Не в сети
студент

Зарегистрирован: Пн июн 30, 2014 11:23 am
Сообщений: 6
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
На XP x86 та же ерунда (5.22). Подтверждаю, ascii или unicode без разницы.

P.S. Чтобы "DebugOutput отражал русские буквы", не забывайте привести настройки компилятора в соответствие с выбранной кодировкой для кода программы.

_________________
PB 5.22 x86 WinXP SP3 Opus


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Сортировка русского текста
СообщениеДобавлено: Вт июл 15, 2014 8:58 am 
Не в сети
док

Зарегистрирован: Чт ноя 22, 2007 8:03 pm
Сообщений: 165
Откуда: Питер
Благодарил (а): 3 раз.
Поблагодарили: 1 раз.
Пункты репутации: 0
Для неюникода понятно (и с выводом и с сортировкой) - надо держать исходники в нужной кодировке.

А вот со встроенной сортировкой, похоже, выход один - сортировать структуру, первое поле - исходный текст, второе поле для сортировки и записывать туда ДВОЙНУЮ строку - склеить строку в верхнем (нижнем) регистре и строку без изменения регистра. Первая часть обеспечит сортировку без учёта регистра, вторая часть обеспечит сортировку в спорных моментах. Нда... расход памяти в три раза выше... Слава богу, преобразование регистра нормально работает.

Или сразу держать склеенные строки, подготовленные для сортировки, в простом массиве, а потом делить их пополам.

П.С.
Поправка - строка для сортировки должна быть не просто склейкой двух, а через разделительный символ с наименьшим возможным кодом нигде в строках больше не встречающимся, например UCase(str)+Chr(1)+str


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 13 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 6


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

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group (блог о phpBB)
Сборка создана CMSart Studio
Русская поддержка phpBB