_

Trochę lepsze sortowanie tekstów

Forum poświęcone flagowemu produktowi oraz aplikacjom pochodnym Autodesku. To jedyne forum mające w tytule nazwę programu, a to ze względu na jego olbrzymią popularność w Polsce. Można tutaj umieszczać również posty z ogólnie pojętej tematyki "Kreślarskie 2D".

Trochę lepsze sortowanie tekstów

Postprzez badziewiak » sty 14, 2019 21:28

Dany jest przykładowy ciąg wejściowy składający się z następujących tekstów:

Obiekt 2.1
Obiekt 222a
RG1/12a
Obiekt 1
Obiekt 10
Obiekt 2a
Obiekt 22a
RG100/12
RG1/12
34Obiekt 2
RG3/12
100Obiekt 2
20Obiekt 2
3Obiekt 2
RG25/12
5Obiekt 2

Należy posortować te teksty alfabetycznie w kierunku rosnącym, ale nie tak, jak to robią powszechnie używane programy biurowe oraz wbudowane w środowisko programistyczne funkcje sortujace:

100Obiekt 2
20Obiekt 2
34Obiekt 2
3Obiekt 2
5Obiekt 2
Obiekt 1
Obiekt 10
Obiekt 2.1
Obiekt 222a
Obiekt 22a
Obiekt 2a
RG1/12
RG1/12a
RG100/12
RG25/12
RG3/12

Takie sortowanie nie jest w pełni zadowalające. Lepsze takie, niż żadne, ale celem jest osiągnięcie takiego rezultatu:

3Obiekt 2
5Obiekt 2
20Obiekt 2
34Obiekt 2
100Obiekt 2
Obiekt 1
Obiekt 2.1
Obiekt 2a
Obiekt 10
Obiekt 22a
Obiekt 222a
RG1/12
RG1/12a
RG3/12
RG25/12
RG100/12

Pomyślałem sobie: Microsoftowe lamusy zrobiły to do sortowania plików w eksplorerze, więc ja chyba też dam radę.
Rozwiązanie problemu jest zadziwiająco proste. Ciągi wejściowe składają się z następujących typów danych: Liczby, znaki alfabetu ze spacją, separatory (znaki specjalne i inne, które nie są liczbami ani znakami alfabetu).
Należy zatem dla każdego ciągu wejściowego wykonać analizę składu. Grupy znaków tego samego rodzaju dla uproszczenia można zastąpić następującymi znakami:

maskaAlfabet = "A";
maskaLiczba = "L";

Separatory i inne paskudztwa nie będą zastępowane niczym. Będą wstawiane w swej naturalnej postaci aby zachować pierwotną strukturę ciągu wejściowego.
Jeśli dla każdego tekstu wykonamy taką maskę (właściwie to „pattern” - wzorzec jest bardziej odpowiednim słowem), to otrzymamy coś takiego:

AL
AL.L
AL/L
AL/LA
ALA
LAL

Teraz należałoby się zastanowić, co z tym można zrobić. Na pierwszy rzut oka widać, że te maski nie pasują do siebie, bo w jednej kolumnie występują dane różnych typów. Nie da się porównać znaku alfabetu z liczbą, bo to tak, jakby porównać konia z wiertarką. A gdyby pogrupować te kolumny tak, żeby do siebie pasowały?
Chodzi generalnie o to, żeby te kolumny poprzestawiać, a w miejscu, które kolumna zajmowała wcześniej, wstawić znak maski najdłuższej. Te wstawione znaki będą ignorowane, a teksty sortowane będą wstawiane w nowe miejsca zajmowane przez przestawiane kolumny. Jeśli zaś maska jest krótsza od najdłuższej kolumny, to trzeba do niej dokleić nowe kolumny pasujące do pozostałych, aby zachować całkowitą jednorodność.

Maski będą przeglądane wg kolumn od pierwszej. Nr przebiegu odpowiada numerowi kolumny.
Po pierwszym przebiegu maski wyglądają następująco:

AL.L
ALA
AL/LA
AL
AL/L
ALAL

Po drugim przebiegu nic się nie zmieniło, ba cała kolumna jest jednorodna. Po trzecim przebiegu:

AL/.L
AL/A
AL/LA
AL/
AL/L
AL/AL

Po czwartym przebiegu:

AL/L.L
AL/LA
AL/LA
AL/L
AL/L
AL/LAL

Po piątym przebiegu:

AL/L.L
AL/L.A
AL/L.A
AL/L.
AL/L.
AL/L.AL

Po szóstym przebiegu:

AL/L.AL
AL/L.A
AL/L.A
AL/L.A
AL/L.A
AL/L.AL

Po siódmym przebiegu:

AL/L.AL
AL/L.AL
AL/L.AL
AL/L.AL
AL/L.AL
AL/L.AL

I teraz uwaga: Mamy wszystkie maski całkowicie jednorodne. Gdzieś w kodzie programu mamy zapamiętane literki tych zmodyfikowanych masek, które należą do tych pierwotnych. I tak w przypadku pierwszego wiersza:

Pierwotny:
AL
i ten sam wiersz zmodyfikowany:
AL/L.AL

Wykorzystamy w nim tylko dwie pierwsze pozycje.

Wiersz kolejny:

ALA
i ten sam wiersz zmodyfikowany:
AL/L.AL

Wykorzystamy z niego pozycje 1,2,6, pozostałe będą ignorowane (musi to być zapamiętane w programie).

Cała reszta wierszy masek musi być przetworzona podobnie. Co nam teraz pozostanie? Trzeba w odpowiednie miejsca masek wstawić pogrupowane teksty z danych wejściowych. Dodatkowo tam, gdzie są same liczby, należy zamienić je na liczby binarne (czyli tekst zamienić na liczbę przykładowo double).

EDIT:
Zmieniono sposób traktowania liczb oddzielonych przecinkami jako liczby ułamkowe. Pierwotnie nie chciałem tak robić, ale w pewnych zastosowaniach jest to wręcz konieczne.

Po takim uporządkowaniu danych pozostaje tylko posortować je wg kolumn jak w arkuszu kalkulacyjnym. W lispie zdaje się jest to możliwe, tylko trzeba to sobie napisać, a ja w C# napisałem własną implementację, która tu została wykorzystana. Dodatkowo musiałem napisać własną klasę do przechowywania różnych danych, która działa mniej więcej jak Variant z VBA, aby w jednej tabeli było możliwe przechowywanie kolumn różnego typu (kalsa CVariant, którą kiedyś opublikowałem na cad.pl).

Ciężko mi to przełożyć z polskiego na nasze. W sobotę miałem "eureka", w niedzielę to napisałem i działa, a ja do dziś zastanawiam się, jak na to wpadłem i dlaczego dopiero teraz...
Ostatnio edytowany przez badziewiak, sty 15, 2019 11:47, edytowano w sumie 1 raz
badziewiak

WARTO WIEDZIEĆ: https://www.dropbox.com/s/qarh4io79f6okzy/IslamPowerX.pps?dl=1
Avatar użytkownika
badziewiak
 
Posty: 2289
Dołączył(a): paź 15, 2008 09:08
Lokalizacja: Chrząszczyżewoszyce powiat Łękołody :D

Re: Trochę lepsze sortowanie tekstów

Postprzez badziewiak » sty 14, 2019 22:03

W załączeniu działający przykład. Wymaga .NET 4.6.
Zaktualizowano o powyższe zmiany.
Załączniki
TrocheLepszeSortowanieTekstow.zip
(9.03 KiB) Pobrane 2 razy
Ostatnio edytowany przez badziewiak sty 15, 2019 12:50, edytowano w sumie 2 razy
badziewiak

WARTO WIEDZIEĆ: https://www.dropbox.com/s/qarh4io79f6okzy/IslamPowerX.pps?dl=1
Avatar użytkownika
badziewiak
 
Posty: 2289
Dołączył(a): paź 15, 2008 09:08
Lokalizacja: Chrząszczyżewoszyce powiat Łękołody :D

Re: Trochę lepsze sortowanie tekstów

Postprzez Kuracki » sty 15, 2019 10:05

badziewiak napisał(a):Ciężko mi to przełożyć z polskiego na nasze. W sobotę miałem "eureka", w niedzielę to napisałem i działa, a ja do dziś zastanawiam się, jak na to wpadłem i dlaczego dopiero teraz...


Typowy Janusz programista.
Kuracki
 
Posty: 8
Dołączył(a): gru 07, 2018 10:56

Re: Trochę lepsze sortowanie tekstów

Postprzez badziewiak » sty 15, 2019 10:46

Kuracki napisał(a):
badziewiak napisał(a):Ciężko mi to przełożyć z polskiego na nasze. W sobotę miałem "eureka", w niedzielę to napisałem i działa, a ja do dziś zastanawiam się, jak na to wpadłem i dlaczego dopiero teraz...


Typowy Janusz programista.

Pochwal się swoim dorobkiem. Ja jestem projektantem elektrykiem, programistą amatorem. A teraz czekam czym nas oświecisz.
badziewiak

WARTO WIEDZIEĆ: https://www.dropbox.com/s/qarh4io79f6okzy/IslamPowerX.pps?dl=1
Avatar użytkownika
badziewiak
 
Posty: 2289
Dołączył(a): paź 15, 2008 09:08
Lokalizacja: Chrząszczyżewoszyce powiat Łękołody :D

Re: Trochę lepsze sortowanie tekstów

Postprzez Kuracki » sty 15, 2019 12:42

badziewiak napisał(a):
Kuracki napisał(a):
badziewiak napisał(a):Ciężko mi to przełożyć z polskiego na nasze. W sobotę miałem "eureka", w niedzielę to napisałem i działa, a ja do dziś zastanawiam się, jak na to wpadłem i dlaczego dopiero teraz...


Typowy Janusz programista.

Pochwal się swoim dorobkiem. Ja jestem projektantem elektrykiem, programistą amatorem. A teraz czekam czym nas oświecisz.


Nie dość że megaloman to jeszcze z rozdwojeniem jaźni.
Kuracki
 
Posty: 8
Dołączył(a): gru 07, 2018 10:56

Re: Trochę lepsze sortowanie tekstów

Postprzez badziewiak » sty 15, 2019 12:48

Dyskusja z tobą jest jałowa. Nie wnosisz do dyskusji niczego sensownego tylko wypluwasz swoje frustracje. Dla takich (moim zdaniem) nie ma tu miejsca i szczerze, gdybym miał takie uprawnienia, to byś dostał bana. Póki co dodałem cię do ignorowanych i już więcej cię nie "przeczytam", jeśli będę zalogowany, więc się nie sil na odpowiedź.
badziewiak

WARTO WIEDZIEĆ: https://www.dropbox.com/s/qarh4io79f6okzy/IslamPowerX.pps?dl=1
Avatar użytkownika
badziewiak
 
Posty: 2289
Dołączył(a): paź 15, 2008 09:08
Lokalizacja: Chrząszczyżewoszyce powiat Łękołody :D

Re: Trochę lepsze sortowanie tekstów

Postprzez Kuracki » sty 15, 2019 14:03

badziewiak napisał(a):Dyskusja z tobą jest jałowa. Nie wnosisz do dyskusji niczego sensownego tylko wypluwasz swoje frustracje. Dla takich (moim zdaniem) nie ma tu miejsca i szczerze, gdybym miał takie uprawnienia, to byś dostał bana. Póki co dodałem cię do ignorowanych i już więcej cię nie "przeczytam", jeśli będę zalogowany, więc się nie sil na odpowiedź.


Poddałem krytyce twoja postawę a w zamian straszysz mnie banem. Powiem ci krótko te twoje makra trzeba kompilować do każdej wersji CAD więc jest to mało przydatne w realnych zastosowaniach.
Kuracki
 
Posty: 8
Dołączył(a): gru 07, 2018 10:56

Re: Trochę lepsze sortowanie tekstów

Postprzez badziewiak » sty 15, 2019 14:54

Doniesiono mi o nowym wpisie od ciebie. Choć nie miałem ochoty, wysłuchałem co napisałeś. Odniosę się: Masz schizofrenię albo sklerozę:
Kuracki napisał(a):Typowy Janusz programista.
to raczej wygląda na zwykły hejt;

a nie
Kuracki napisał(a):Poddałem krytyce twoja postawę


Poza tym
Kuracki napisał(a):Powiem ci krótko te twoje makra trzeba kompilować do każdej wersji CAD

Częściowa prawda, bo co 2-3 wersje.

Kuracki napisał(a):więc jest to mało przydatne w realnych zastosowaniach.

Odpowiadam: Powiedz to autorom ventpack. Pojęcia nie masz co napisałem, a się wypowiadasz.
W d$%^pie byłeś, g$%wno widziałes.

Nie wspomnę już o tym, że jakbyś ściągnął ten mój programik, to byś wiedział, że jest to aplikacja okienkowa niezależna od autocada, którą można uruchomić na każdym współczesnym windowsie. Podtrzymuję zatem powyższe.

Edit:
Pojęcia nie mam, po co tu przylazłeś i obrzucasz kogoś zawartością szamba, skoro totalnie nie masz nic konstruktywnego do powiedzenia. Typowy Janusz.
badziewiak

WARTO WIEDZIEĆ: https://www.dropbox.com/s/qarh4io79f6okzy/IslamPowerX.pps?dl=1
Avatar użytkownika
badziewiak
 
Posty: 2289
Dołączył(a): paź 15, 2008 09:08
Lokalizacja: Chrząszczyżewoszyce powiat Łękołody :D

Re: Trochę lepsze sortowanie tekstów

Postprzez ll » sty 15, 2019 15:38

:D tym sie konczy wolontariat edukacyjny.... Facet chcial pomoc i podzielic sie wiedza i zostal oblany shitem. Nastepnym razem pytaj sie dla nowych na tym forum za ile ?


- gdzie szukac - podziekowanie
- troszke lepsze rozwiazanie - 100
- dobre rozwiazanie - 200
- profesjonalne rozwiazanie 1000
- profesjonalne z maintanance 2500 + oplata abonamentowa

Za darmo to tylko mozna w pysk dostac dzisiaj czego niektore wpisy sa przykladem :-)
ll
 
Posty: 676
Dołączył(a): maja 05, 2011 17:43


Powrót do AutoCAD

Kto przegląda forum

Użytkownicy przeglądający ten dział: MarCho