Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Mi Mai 15, 2024 10:23

Foren-Übersicht » Programmierung » Allgemein
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 12 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Map Sortieren
BeitragVerfasst: Di Sep 20, 2011 11:33 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Dez 11, 2009 08:02
Beiträge: 532
Programmiersprache: pascal (Delphi 7)
Ich stehe gerade vor dem Problem, eine TFPGMap<integer, integer> nach dem zweiten Integer zu sortieren. Wie? Ich meine Sort wird das Ding zwar irgendwie sortieren, aber nicht unbedingt so, wie ich das will. was genau ich da mit der function(pointer, pointer): integer; machen soll, weiß ich auch nicht. Mir ist schon klar, dass die beiden Pointer auf die Daten zeigen, die verglichen werden sollen, aber auf welche Daten und wie sind diese angeordnet?

Und nein, ich kann nicht einfach eine Liste nehmen, weil gerade der erste Integer kann theoretisch sehr große Werte annehmen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Map Sortieren
BeitragVerfasst: Di Sep 20, 2011 13:13 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mär 30, 2007 18:35
Beiträge: 331
Ich weiß zwar nicht, was genau eine "TFPGMap" ist, aber normalerweise sortiert man eine Map nicht nach dem Value.

Wie dem auch sei, ich vermute, dass diese Funktion in den Argumenten zwei Werte hat, die verglichen werden sollen. Du musst in deiner Funktion jetzt schauen welcher wert größer ist und entweder -1, 0 oder 1 zurückgeben. 0 bedeutet die Werte sind gleich, -1 bedeutet der erste Wert ist kleiner und 1 bedeutet der Wert ist größer.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Map Sortieren
BeitragVerfasst: Di Sep 20, 2011 14:08 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Wie genau versuchst du die Map zu sortieren (welche Methode rufst du auf)?

Eigentlich sind die Maps nämlich nichts weiter als sortierte Listen. Du solltest die Sortierung nicht ändern, da sonst die Suche von Elementen in der Liste nicht mehr sicher funktionieren wird (das ist als Binärsuche implementiert).

Wenn du also deine Einträge sortiert haben möchtest, solltest du sie in einer anderen Liste zwischenspeichern (möglicherweise als Record aus zwei Integer oder so) und diese mit einer eigenen Sortierfunktion sortieren (also List.Sort(@CompareFunc), wobei CompareFunc die Pointer nimmt (die auf die Listenelemente, die zu vergleichen sind zeigen) und werte wie Markus sie schon genannt hat zurückgeben muss).

greetings

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Map Sortieren
BeitragVerfasst: Di Sep 20, 2011 14:16 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Dez 11, 2009 08:02
Beiträge: 532
Programmiersprache: pascal (Delphi 7)
@Markus: Ja, was die Funktion tun soll, ist mir schon klar. Das Problem ist, ich weiß nicht, wie, weil ich habe nur zwei Pointer, und keine Ahnung, wo meine Daten sind.
TFPGMap ist einfach eine Map, Free Pascal braucht da überall noch ein paar Buchstaben vorne dran ;)
Und ja, die soll nach dem Value sortiert werden. Ich zähle da nämlich die Häufigkeit bestimmter Werte und den häufigsten will ich dann haben (ob zwei gleich oft vorkommen ist egal, ich brauche nur einen der häufigsten). Also benutze ich die Werte als Key und trage dann die Häufigkeit als Value ein - nur sortiert müsste jetzt noch werden (Ja, ich weiß, eine lineare Suche würd´s auch tun, aber damit gibt´s dasselbe Problem - ich weiß nicht, wo die Daten sind, oder wie ich rankommen soll außer Key -> Value. Das Problem damit ist, ich kenne auch die Keys nicht bzw müsste mir erst eine Liste erstellen usw).

edit: ok, werd´s anders versuchen
Zitat:
Du solltest die Sortierung nicht ändern, da sonst die Suche von Elementen in der Liste nicht mehr sicher funktionieren wird


Zitat:
Wie genau versuchst du die Map zu sortieren (welche Methode rufst du auf)?
Momentan gar keine, aber ich habe da eine geerbte public-methode Sort gefunden, die ich vorhatte zu benutzen. Aber naja, wenn die Map dann nicht mehr funktioniert...


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Map Sortieren
BeitragVerfasst: Di Sep 20, 2011 18:01 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Jan 31, 2007 18:32
Beiträge: 150
Programmiersprache: Pascal
Schau doch einfach in der implementierung von Map nach die is offen einsehbar ...

TFPSListCompareFunc gibt die 2 element vom type Pointer
beide sind PInteger in deinem Fall
Rückgabewert ist > 0 bzw < 0

siehe :
Code:
  1.  
  2.  
  3. procedure TFPGMap.PutKey(Index: Integer; const NewKey: TKey);
  4. begin
  5.   inherited PutKey(Index, @NewKey);
  6. end;    
  7.  
  8. procedure TFPSList.QuickSort(L, R: Integer; Compare: TFPSListCompareFunc);
  9. var
  10.   I, J, P: Integer;
  11.   PivotItem: Pointer;
  12. begin
  13.   repeat
  14.     I := L;
  15.     J := R;
  16.     P := (L + R) div 2;
  17.     repeat
  18.       PivotItem := InternalItems[P];
  19.       while Compare(PivotItem, InternalItems[I]) > 0 do
  20.         Inc(I);
  21.       while Compare(PivotItem, InternalItems[J]) < 0 do
  22.         Dec(J);
  23.       if I <= J then
  24.       begin
  25.         InternalExchange(I, J);
  26.         if P = I then
  27.           P := J
  28.         else if P = J then
  29.           P := I;
  30.         Inc(I);
  31.         Dec(J);
  32.       end;
  33.     until I > J;
  34.     if L < J then
  35.       QuickSort(L, J, Compare);
  36.     L := I;
  37.   until I >= R;
  38. end;  
  39.  


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Map Sortieren
BeitragVerfasst: Mi Sep 21, 2011 11:38 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
FrenK: Wie nur schon erwähnt, funktioniert dann die map nicht mehr richtig.

sharkman: Für deinen Anwendungsfall würde ich dir dann empfehlen, ganz auf eine Liste aus Records oder Objekten umzusteigen und die Map-Funktionalität selber zu implementieren. Die TFPGMap kennt übrigens auch das Feld Keys, über das du die Keys rausbekommst (wie bei einer Liste). Einfach von 0 bis Map.Count-1 iterieren.

greetings

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Map Sortieren
BeitragVerfasst: Fr Sep 23, 2011 23:11 
Offline
Forenkatze
Benutzeravatar

Registriert: Mi Okt 22, 2003 18:30
Beiträge: 1945
Wohnort: Närnberch
Programmiersprache: Scala, Java, C*
Öh... so Verständnishalber: Eine Map (Eine HashMap z.B.) ist doch erstmal gar nicht sortiert? Das ist einfach eine unsortierte Menge von 2er Tupeln und auf den 1. Wert der Tupel kann man ziemlich fix zugreifen.

Oder in anderen Worten: Ein Dictionary

_________________
"Für kein Tier wird so viel gearbeitet wie für die Katz'."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Map Sortieren
BeitragVerfasst: Fr Sep 23, 2011 23:24 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Frase hat geschrieben:
Öh... so Verständnishalber: Eine Map (Eine HashMap z.B.) ist doch erstmal gar nicht sortiert? Das ist einfach eine unsortierte Menge von 2er Tupeln und auf den 1. Wert der Tupel kann man ziemlich fix zugreifen.

Ja, um den Zugriff zu beschleunigen, werden die dinger aber meist nach implementationsabhängigen Kriterien sortiert. Z.B. einfach aufsteigend/absteigend um ne Binärsuche durchführen zu können. Oder garnicht, weil die Typen nicht sortierbar sind.

greetings

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Map Sortieren
BeitragVerfasst: Sa Sep 24, 2011 00:19 
Offline
Forenkatze
Benutzeravatar

Registriert: Mi Okt 22, 2003 18:30
Beiträge: 1945
Wohnort: Närnberch
Programmiersprache: Scala, Java, C*
Jo. Wie eine HashMap, die die Keys erstmal hashed. Was für 95% (wenn nicht 99%) aller Fälle die schnellste Lösung ist. Und die Hashes werden in Buckets abgelegt. Das hat mit Sortieren nicht viel am Hut. Aber ich glaub, das ist hinsichtlich der Eingangsfrage leicht wurstig...

Für mich sieht das mehr nach RTFM aus. Die Map von FPC wird ja wohl irgendwo dokumentiert sein. Mindestens über "Keys" kommst du auch an die Values. Vielleicht bietet dir die Map aber direkt eine "Values" Property oder sowas an.
Nichtsdestotrotz klingt das alles nicht so wirklich danach, wie eine Map normalerweise benutzt wird / werden sollte. Bist du sicher, dass Map die richtige Datenstruktur für was-auch-immer-du-vorhast ist?

_________________
"Für kein Tier wird so viel gearbeitet wie für die Katz'."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Map Sortieren
BeitragVerfasst: Sa Sep 24, 2011 16:25 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Jan 31, 2007 18:32
Beiträge: 150
Programmiersprache: Pascal
Um das mal gerade zu rücken eine Map wie sie dort vorliegt ist nichts anderes als eine datenstrucktur bei der jedem wert ein schlüssel zugeordnet ist(nicht mehr nicht weniger). Da wir intern einfach eine liste mit schlüsseln vorliegen haben macht es durchaus sinn diese zu sortieren. was über die funktionalität die ich weiter ob gepostet habe möglich ist.
Natürlich sind auch zugriffsmöglichkeit auf die Werte nach Schlüssel vorhanden.
Ohne jetzt jemand zu nahe treten zu wollen, wieso spekuliert ihr darüber was TFPGMap kann oder nicht die datei ist offen im svn einzusehen und jeder der fpc hat kann sie sich lokal anschauen, wenn ihr das nicht wollt ist es schlicht weg lesen in der kristallkugel wenn ihr versucht zu helfen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Map Sortieren
BeitragVerfasst: Sa Sep 24, 2011 19:55 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Ich habe nicht spekuliert, ich habe in den Quelltext geschaut…

greetings

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Map Sortieren
BeitragVerfasst: So Sep 25, 2011 11:58 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Dez 11, 2009 08:02
Beiträge: 532
Programmiersprache: pascal (Delphi 7)
ok, hab jetzt einfach ne lineare Suche benutzt, funktioniert jetzt.

Das Problem mit in den Quelltext schauen ist nur, bis auf den interface-bereich verstehe ich da genau nichts.


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 12 Beiträge ] 
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 7 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.022s | 17 Queries | GZIP : On ]