CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - THashedStringList - sortowanie

THashedStringList - sortowanie

dział ogólny

THashedStringList - sortowanie

Nowy postprzez Minister » sobota, 28 sierpnia 2010, 18:51

Witam.
Chcę się dowiedzieć, jak można sortować listę zawierającą nazwy i wartości.
Najpierw wyjaśnię całą sytuację. Zrobiłem mini grę, którą trzeba przejść "jak najszybciej" - czyli im niższy wynik, tym lepiej. Chciałem, by można było prowadzić tabelę wyników - nazwy graczy i przypisane wyniki. Pomyślałem o plikach ini, i za pomocą ReadSectionValues do Memo lub ListBoxa wprowadziłem dane w postaci gracz=100, ale to nie jest zbyt estetyczne, wygodne ani nic :)
Znalezłem ten THashedStringList. Mi Memo lub ListBox wystarczą. Ale jak taką listę posortować? Dwa możliwe sortowania: Nazwa gracza i Ilość punktów.
Avatar użytkownika
Minister
Bladawiec
Bladawiec
 
Posty: 5
Dołączył(a): wtorek, 24 sierpnia 2010, 20:18
Podziękował : 1
Otrzymał podziękowań: 0
System operacyjny: Windows XP
Kompilator: C++ Builder 2007
Gadu Gadu: 0
    Windows 7Firefox

Re: THashedStringList - sortowanie

Nowy postprzez Krzysiu555 » sobota, 28 sierpnia 2010, 20:33

jeśli chodzi o Listbox to ma on właściwość sorted w object inspectorze więc możesz ją na true dać.

jednak wydaję mi się że tu również będzie dobrym rozwiązaniem to co mi doradzono czyli StringList
viewtopic.php?f=2&t=1064

do sortowania wyników dobry by był Bubblesort (chyba)
http://cpp.koderzy.pl/art1-1/Sortowanie ... elkowe.php
http://doctor.programuj.com/algorytmy

mógłbyś zrobić tak że odczytujesz pierwszego gracza po indexie i drugiego sprawdzasz ich wyniki i jeśli ten drugi ma większy to zamieniasz ich (zamieniasz całe Stringi)

kodu nie podam bo nie jestem aż tak dobry;P
Avatar użytkownika
Krzysiu555
Intelektryk
Intelektryk
 
Posty: 161
Dołączył(a): sobota, 23 sierpnia 2008, 16:55
Podziękował : 2
Otrzymał podziękowań: 1
System operacyjny: Windows 7 Professional 64
Kompilator: C++ Builder 6 Personal
Gadu Gadu: 0
    Windows 7Firefox

Re: THashedStringList - sortowanie

Nowy postprzez Cyfrowy Baron » niedziela, 29 sierpnia 2010, 08:06

Zamiast THashedStringList użyj klasy TStringList.

Opis sortowania na różne sposoby, czyli wg. tekstu, wg. liczb oraz wg. liczb i tekstu znajdziesz w serwisie Cyfrowy Baron w dziale: porady -> TStringList -> Sortowanie listy według różnych kryteriów (liczby lub tekstu).
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: THashedStringList - sortowanie

Nowy postprzez Minister » niedziela, 29 sierpnia 2010, 13:00

Witam. Skorzystałem z TStringList, ale mam problem w sortowaniu. Korzystam z plików ini - tam są nazwy i wartości(wyniki).
To jest mój plik ini z wynikami.
Kod: Zaznacz cały
[HIGHSCORES]
gracz1=5543
gracz2=12234
gracz3=65
gracz4=247
gracz5=123

Poprawnie ląduje on w ListBoxie, potem chcę go posortować. I sortuje, ale źle.
Posortowana kolejność to:
247,123,65,5543,12234 - tak więc nie wiem jak to sortowało, by taki wynik był. Wybrałem poprawny profiks :
KOD cpp:     UKRYJ  
 SortList(ListBox1, tsInt, "=");
, ale to nic nie daje.
Avatar użytkownika
Minister
Bladawiec
Bladawiec
 
Posty: 5
Dołączył(a): wtorek, 24 sierpnia 2010, 20:18
Podziękował : 1
Otrzymał podziękowań: 0
System operacyjny: Windows XP
Kompilator: C++ Builder 2007
Gadu Gadu: 0
    Windows 7Firefox

Re: THashedStringList - sortowanie

Nowy postprzez Cyfrowy Baron » niedziela, 29 sierpnia 2010, 13:58

Funkcje podane w serwisie Cyfrowy Baron nie potrafią sortować listy zawierającej tekst i liczby jednocześnie, jeżeli liczba nie znajduje się na początku, lecz na końcu linii.

Funkcja będzie działać, ale trzeba ją trochę przerobić:

KOD cpp:     UKRYJ  
#include <inifiles.hpp> // to umieść w pliku nagłówkowym
#include <memory>      // to umieść w pliku źródłowym, biblioteka potrzebna do auto_ptr

//---------------------------------------------------------------------------
#pragma warn +csu
int foo(int u, int i)
{
 int z = u - i;
 return z;
}
//---------------------------------------------------------------------------
String sortPrefix;
int __fastcall CustomSortDbInt(TStringList *Lista, int idx1, int idx2)
{
 String cTemp1 = Lista->Strings[idx1];
 String cTemp2 = Lista->Strings[idx2];

 int x1 = cTemp1.Pos(sortPrefix);
 int x2 = cTemp2.Pos(sortPrefix);

 int rTemp1 = cTemp1.SubString(x1 + 1, cTemp1.Length()).Trim().ToIntDef(0);
 int rTemp2 = cTemp2.SubString(x2 + 1, cTemp2.Length()).Trim().ToIntDef(0);

 return foo(rTemp1, rTemp2);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 std::auto_ptr<TStringList> tmpList(new TStringList()); // lista tymczasowa, sama po sobie posprząta

 String fileIni = ExtractFilePath(ParamStr(0)) + "test.ini";
 std::auto_ptr<TIniFile> Ini(new TIniFile( fileIni ));

 Ini->ReadSectionValues("HIGHSCORES", tmpList.get());

 sortPrefix = "=";
 tmpList->CustomSort(CustomSortDbInt);
 ListBox1->Sorted = false;
 ListBox1->Items->Assign(tmpList.get());
}


Jeżeli nie bardzo umiesz posługiwać się wzorcem klasy auto_ptr to możesz to zrobić też tak:

KOD cpp:     UKRYJ  
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 TStringList* tmpList = new TStringList()

 String fileIni = ExtractFilePath(ParamStr(0)) + "test.ini";
 TIniFile *Ini = new TIniFile( fileIni );

 Ini->ReadSectionValues( "HIGHSCORES", tmpList );

 sortPrefix = "=";
 tmpList->CustomSort(CustomSortDbInt);
 ListBox1->Sorted = false;
 ListBox1->Items->Assign( tmpList );

 delete Ini;
 delete tmpList;
}
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox


  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 4 gości