Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Сортировка (при различном типе индексов) / 11 сообщений из 11, страница 1 из 1
03.05.2006, 11:26
    #33703520
М_а_й_к
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка (при различном типе индексов)
Имеется глобаль следующего вида:
^test(1)="A"
^test(1.1)="Б"
^test(1.2)="В"
^test(1.12)="Г"
^test(2)="Д"
^test(2.1)="Е"
^test(2.15)="Ж"
^test("1.10")="З"
^test("2.10")="И"

Как бы поизящнее отсортировать это, чтобы на выходе было:

^t2(1)="1~А"
^t2(2)="1.1~Б"
^t2(3)="1.2~В"
^t2(4)="1.10~З"
^t2(5)="1.12~Г"
^t2(6)="2~Д"
^t2(7)="2.1~Е"
^t2(8)="2.10~И"
^t2(9)="2.15~Ж"
...
Рейтинг: 0 / 0
03.05.2006, 12:58
    #33703796
AlexanderYe
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка (при различном типе индексов)
s gl=$na(^resr)
s ind=""
s newind=0
f s ind=$o(@gl@(ind)) q:ind="" d
.s newind=newind+1
.s ^t2(newind)=ind_"~"_$g(@gl@(ind))
q
...
Рейтинг: 0 / 0
03.05.2006, 13:01
    #33703806
AlexanderYe
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка (при различном типе индексов)
s gl=$na(^resr)
заменить на s gl=$na(^test)
тороплюсь..-(
...
Рейтинг: 0 / 0
03.05.2006, 13:57
    #33704059
Sergei Obrastsov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка (при различном типе индексов)
AlexanderYes gl=$na(^resr)
s ind=""
s newind=0
f s ind=$o(@gl@(ind)) q:ind="" d
.s newind=newind+1
.s ^t2(newind)=ind_"~"_$g(@gl@(ind))
q
а попроще никак нельзя? например:

s ind="" f i=1:1 s ind=$o(^test(ind)) q:ind="" s ^t2(i)=ind_"~"_^(ind)

это, конечно, с учетом цифровой сортировки. в случае строковой - надо
подумать.

С уважением. Сергей
...
Рейтинг: 0 / 0
03.05.2006, 14:07
    #33704100
М_а_й_к
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка (при различном типе индексов)
Sergei Obrastsov[quot AlexanderYe]s gl=$na(^resr)
s ind="" f i=1:1 s ind=$o(^test(ind)) q:ind="" s ^t2(i)=ind_"~"_^(ind)

это, конечно, с учетом цифровой сортировки. в случае строковой - надо
подумать.

С уважением. Сергей

:)
Сергей, в этом и смысл получить как было в моем примере. т.е. за 1.1 должно идти 1.10.
...
Рейтинг: 0 / 0
03.05.2006, 14:25
    #33704169
М_а_й_к
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка (при различном типе индексов)
AlexanderYes gl=$na(^resr)
заменить на s gl=$na(^test)
тороплюсь..-(

В Вашем примере получается в новой созданной глобали сортировка та же, что и первой, а смысл как раз был, чтобы строковые индексы встали куда следует, а не в конец глобали.
...
Рейтинг: 0 / 0
03.05.2006, 14:49
    #33704251
ну я
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка (при различном типе индексов)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
 s i="" f  s i=$o(^test(i)) q:i=""  d
 . ; строковые придут на вставку после числовых
 . s ^t1(+i,$i(^t1))=i_"~"_^test(i)
 ; проверяем что сортировки корректны
 zw ^t1
 ; формируем порядковый номер
 s i=$na(^t1) f  s i=$q(@i) q:i=""  d
 . s ^t2($i(^t2))=@i
 ; проверяем через порядковые номера
 zw ^t2
Получается вот что
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
^t2( 1 )="1~A"
^t2( 2 )="1.1~Б"
^t2( 3 )="1.10~З"
^t2( 4 )="1.12~Г"
^t2( 5 )="1.2~В"
^t2( 6 )="2~Д"
^t2( 7 )="2.1~Е"
^t2( 8 )="2.10~И"
^t2( 9 )="2.15~Ж"
В исходной задаче не понятно что означает
Код: plaintext
1.
2.
3.
4.
^t2( 2 )="1.1~Б"
^t2( 3 )="1.2~В"
^t2( 4 )="1.10~З"
^t2( 5 )="1.12~Г"
Может, опечатка?
...
Рейтинг: 0 / 0
03.05.2006, 15:20
    #33704366
AlexanderYe
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка (при различном типе индексов)
превращаю все индексы в строки

s gl=$na(^test)
k ^t3
s ind=""
f s ind=$o(@gl@(ind)) q:ind="" d
.s ^t3(ind_".0")=ind_"~"_$g(@gl@(ind))
q

значения узлов отсортированы
остатеся только поменять индексы на 1,2,3...
...
Рейтинг: 0 / 0
04.05.2006, 08:39
    #33705635
М_а_й_к
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка (при различном типе индексов)
ну я
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
 s i="" f  s i=$o(^test(i)) q:i=""  d
.................. 

В исходной задаче не понятно что означает
[src]^t2( 2 )="1.1~Б"
^t2( 3 )="1.2~В"
^t2( 4 )="1.10~З"
^t2( 5 )="1.12~Г"
Может, опечатка?

Как раз и не опечатка. Для наглядности представьте, что это номера разделов в документе. Т.е. именно так и нужно отсортировать:
1
1.1
1.2
1.10
1.12
...
Рейтинг: 0 / 0
04.05.2006, 10:35
    #33705986
ну я
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка (при различном типе индексов)
М_а_й_кКак раз и не опечатка. Для наглядности представьте, что это номера разделов в документе. Т.е. именно так и нужно отсортировать:
1
1.1
1.2
1.10
1.12
Тогда так
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
 s i="" f  s i=$o(^test(i)) q:i=""  d
 . s ^t1(i\ 1 ,+$p(i,".", 2 ))=i_"~"_^test(i)
 ; формируем порядковый номер
 zw ^t1
 s i=$na(^t1) f  s i=$q(@i) q:i=""  d
 . s ^t2($i(^t2))=@i
 ; проверяем через порядковые номера
 zw ^t2
^t2(1)="1~A"
^t2(2)="1.1~Б"
^t2(3)="1.2~В"
^t2(4)="1.10~З"
^t2(5)="1.12~Г"
^t2(6)="2~Д"
^t2(7)="2.1~Е"
^t2(8)="2.10~И"
^t2(9)="2.15~Ж"
...
Рейтинг: 0 / 0
06.05.2006, 15:08
    #33713307
ну я
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка (при различном типе индексов)
Есть еще вариант через приведение к строковой сортировке и учитывание что могут быть не одна точка.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
 s i="" f  s i=$o(^test(i)) q:i=""  d
 . s sort=""
 . f n= 1 : 1 :$l(i,".") s sort=sort_$j($p(i,".",n), 6 )
 . s ^t1(sort)=i_"~"_^test(i)
 ; формируем порядковый номер
 zw ^t1
 s i=$na(^t1) f  s i=$q(@i) q:i=""  d
 . s ^t2($i(^t2))=@i
 ; проверяем через порядковые номера
 zw ^t2
...
Рейтинг: 0 / 0
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Сортировка (при различном типе индексов) / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]