Announcement

Collapse
No announcement yet.

Grid nach einer Spalte sortieren

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Grid nach einer Spalte sortieren

    Ich habe ein Anzeigeprogramm (viewer) geschrieben, mit dem ich verschiedene intern verwendete Dateien Feldweise in ein Grid einlese, um sie anzuzeigen. Das ist soweit auch alltagstauglich.

    Nun habe ich das Programm um eine Funktion erweitert, die das sortieren das Grid nach einer wählbaren Spalte erlaubt. Auch das klappt.

    Mein Problem: bei mehr als 1000 Sätzen wird der Sort drastisch langsamer. (Kommt normalerweise nicht vor, aber jetzt soll das Programm halt auch für große Dateien mit 50.000 und mehr Sätzen benutzt werden ...)

    Frage: Gibt es einen Befehl, mit dem man das Grid sortieren kann oder kennt jemand eine passende Sortierfunktion, die auch bei mehr als 1000 Sätzen noch erträglich Geschwindigkeiten erreicht?

    Alfred

  • #2
    Nun habe ich das Programm um eine Funktion erweitert, die das sortieren das Grid nach einer wählbaren Spalte erlaubt.
    Dazu wäre ja erstmal notwendig zu wissen, wie du das Grid sortierst.

    Vielleicht ist diese hier schnell genug:

    http://www.bytesandmore.de/rad/cpp/snipp/sc02039.php

    und mal mit diesem Grid testen (gut angelegtes Geld)

    http://www.tmssoftware.com/advgrid2.htm

    Ev. auch andere Technik verwenden:

    Nicht das Grid sortieren, sondern die Daten und diese nach Sortierung ins Grid schieben
    Christian

    Comment


    • #3
      Danke Christian für die schnelle Antwort

      Hab gleich mal die Sorts aus Deiner Antwort ausprobiert. Die sind leider auch nicht schneller.

      Werde wohl auf ein sortieren der Sätze umstellen müssen. Das wollte ich eigentlich vermeiden, aber wenn es sich nicht umgehen lässt ....

      Danke nochmal

      Comment


      • #4
        Da das Interesse am sortieren von Grids von eurer Seite her größer als erwartet ist hier der von mir verwendete Code.

        Der Sort eines Grid nach einer bestimmten Spalte dauert mit der folgenden (als FastSort bezeichneten) Routine bei mir bei bis zu 1000 Zeilen unter 1 Sekunde.

        Code:
        //---------------------------------------------------------------------------
        //  Grid SORTIEREN mit FastSort (sortieren StringGrid nach Spalte ACol)
        //  by Alfred K. Schneider  www. AKSchneider.de www.ema-software.de
        
        void StringGridSort(TStringGrid* StringGrid, int ACol)
        {   long w, x, z;
            int sw;
            char s[260];
            AnsiString sbuf;
        
            z = StringGrid->RowCount; // letztes gefuelltes Grid   (1 .. n)
            z--;
        
            if(z > 1)                  // bei mehr als 1 Eintrag Sortierung !!
            { for(x=StringGrid->FixedRows; x<=z; x++)
              { strcpy(s,StringGrid->Cells[ACol][x].c_str());
                sw = 0;
                for(w=x; w<=z; w++)
                { if(strcmp(s,StringGrid->Cells[ACol][w].c_str()) > 0)
                  { strcpy(s,StringGrid->Cells[ACol][w].c_str());
                    sw = w;
                  }
                }
                if(sw > 0)
                { w = sw;
                  sbuf = StringGrid->Rows[x]->Text;
                  StringGrid->Rows[x]->Text = StringGrid->Rows[w]->Text;
                  StringGrid->Rows[w]->Text = sbuf;
        
                }
              }
            }
        }
        Und hier der Vollständigkeit halber die gleiche Routine als Bubble-Sort.
        Das dauert dann bei 1000 Sätzen schon weit mehr als 10 Sekunden.

        Code:
        //---------------------------------------------------------------------------
        //  Grid SORTIEREN mit BubbleSort (sortieren StringGrid nach Spalte ACol)
        //  by Alfred K. Schneider  www. AKSchneider.de www.ema-software.de
        
        void StringGridSortb(TStringGrid* StringGrid, int ACol)
        {   long x, y, z;
            int sw;
            char h[260];
            char s[260];
            AnsiString sbuf;
        
            z = StringGrid->RowCount; // letztes gefuelltes Grid   (1 .. n)
            z--;
            y = StringGrid->ColCount; // Anzahl Spalten
            if(z > 1)                  // bei mehr als 1 Eintrag Sortierung !!
            { while(1)
              { sw = 0;
                for(x=StringGrid->FixedRows; x<z; x++)
                { strcpy(h,StringGrid->Cells[ACol][x].c_str());
                  strcpy(s,StringGrid->Cells[ACol][x+1].c_str());
                  if(strcmp(h,s) > 0) 
                  { sw = 1;
                    sbuf = StringGrid->Rows[x]->Text;
                    StringGrid->Rows[x]->Text = StringGrid->Rows[x+1]->Text;
                    StringGrid->Rows[x+1]->Text = sbuf;
                  }
                }
                if(sw == 0)            // sortierung beendet
                  break;
              }
            }
        }
        Für Fragen und Antworten könnt ihr mir ne Mail schicken. (Festnetztelefon kann hilfreich sein)

        Grüsse, Alfred

        Comment


        • #5
          Super,

          man könnte sich das Werkeln mit den strcpy & char noch sparen, wenn man die AnsiString Compare Methoden nutzt
          Christian

          Comment

          Working...
          X