AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Spaltengenau sortieren

Ein Thema von Bjoerk · begonnen am 11. Jan 2015 · letzter Beitrag vom 12. Jan 2015
Antwort Antwort
Seite 1 von 3  1 23      
Bjoerk

Registriert seit: 28. Feb 2011
Ort: Mannheim
1.384 Beiträge
 
Delphi 10.4 Sydney
 
#1

Spaltengenau sortieren

  Alt 11. Jan 2015, 15:33
Delphi-Version: 2007
Ich muß zum Beispiel das Wort NOTEBOOK so sortieren, daß die Reihenfolge doppelt vorkommender Buchstaben erhalten bleibt. Hier also 54812673. Ein herkömmliches stabiles Sortierverfahren berücksichtigt das nicht (weil O eben O). Ich brech mir dabei grad einen ab. Hat jemand eine bessere Idee? (Die Indices (Dest) brauch ich im Programm später).

Delphi-Quellcode:
function MinCharPos(const S: string; const NoChar: char): integer;
var
  MinChar: Char;
  I, J: integer;
begin
  Result := 0;
  MinChar := NoChar;
  for I := 1 to Length(S) do
    if S[I] <> NoChar then
    begin
      MinChar := S[I];
      Break;
    end;
  if MinChar <> NoChar then
  begin
    for I := 1 to Length(S) do
      for J := 1 to Length(S) do
        if (I <> J) and (S[I] <> NoChar) and (S[I] <= MinChar) then
          MinChar := S[I];
    for I := Length(S) downto 1 do
      if S[I] = MinChar then
        Result := I;
  end;
end;

procedure SortByKey(const S, Key: string; Dest: TIntegerList); // Spaltengenau sortieren;
var
  TempKey: string;
  I, J: integer;
begin
  Dest.Clear;
  if (Length(Key) > 0) and (Length(Key) = Length(S)) then
  begin
    for I := 0 to Length(Key) do
      Dest.Add(0);
    TempKey := Key;
    for I := 1 to Length(TempKey) do
    begin
      J := MinCharPos(TempKey, Char(254));
      Dest[I] := J;
      TempKey[J] := Char(254);
    end;
  end;
end;
  Mit Zitat antworten Zitat
DSP

Registriert seit: 10. Jul 2014
49 Beiträge
 
#2

AW: Spaltengenau sortieren

  Alt 11. Jan 2015, 15:40
Was meinst du mit der Reihenfolge von doppelten Buchstaben und weshalb sollte O nicht gleich O sein?

Grüsse
DSP
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#3

AW: Spaltengenau sortieren

  Alt 11. Jan 2015, 15:44
Er mochte, dass das erste O vor dem zweiten O und das vor dem dritten O in der Sortierung bleibt. Damit habe ich eigentlich schon den entscheidenen Hinweis geliefert

BTW Ist die Angabe der Reihenfolge 54812673 bewusst falsch, oder nur vertippt?
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#4

AW: Spaltengenau sortieren

  Alt 11. Jan 2015, 15:59
Ich muß zum Beispiel das Wort NOTEBOOK so sortieren, daß die Reihenfolge doppelt vorkommender Buchstaben erhalten bleibt. Hier also 54812673. Ein herkömmliches stabiles Sortierverfahren berücksichtigt das nicht (weil O eben O).
Das ist doch gerade DAS Merkmal eines stabilen Sortierverfahrens: Elemente, die "gleich" sind, bleiben in der Eingabereihenfolge.
  Mit Zitat antworten Zitat
Bjoerk

Registriert seit: 28. Feb 2011
Ort: Mannheim
1.384 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: Spaltengenau sortieren

  Alt 11. Jan 2015, 16:00
Ja. Sorry.

Code:
NOTEBOOK
12345678

BEKNOOOT
54812673

Geändert von Bjoerk (11. Jan 2015 um 16:19 Uhr)
  Mit Zitat antworten Zitat
DSP

Registriert seit: 10. Jul 2014
49 Beiträge
 
#6

AW: Spaltengenau sortieren

  Alt 11. Jan 2015, 16:00
Der Sinn erschliesst sich mir nicht, weshalb braucht man unbedingt 1101 wenn es ein 1101 ebenfalls tut resp identisch ist? Ansonsten wüsste ich nicht, warum ein Stabiles Sortierverfahren plötzlich instabil werden sollte, das ist aber ein anderes Thema. Ansonsten gibt es ja noch die Möglichkeit ein eigenes Sortierfeld zu deklarieren und dieses nach belieben bestückt, bspw wo bestimmte Sequenzen durch Token getauscht werden.

Grüsse
DSP
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Spaltengenau sortieren

  Alt 11. Jan 2015, 16:01
Zitat:
Der Sinn erschliesst sich mir nicht, weshalb braucht man unbedingt 1101 wenn es ein 1101 ebenfalls tut resp identisch ist?
Z.B. wegen den Werten in den weiteren Spalten.
Markus Kinzler
  Mit Zitat antworten Zitat
DSP

Registriert seit: 10. Jul 2014
49 Beiträge
 
#8

AW: Spaltengenau sortieren

  Alt 11. Jan 2015, 16:04
Weshalb willst du denn einzelne Spalten nicht sortieren?

Da kannst dir die Sortiererei gkeich ganz sparen, ... ansonsten halt eine Skiptabelle mit inplementieren, damit du gezielt einzellne Spalten überspringen kannst.

<verwundert>

Geändert von DSP (11. Jan 2015 um 16:07 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.024 Beiträge
 
Delphi 12 Athens
 
#9

AW: Spaltengenau sortieren

  Alt 11. Jan 2015, 16:05
BTW Ist die Angabe der Reihenfolge 54812673 bewusst falsch, oder nur vertippt?
Ja. Sorry.

Code:
NOTEBOOK
45821673

Habe ich da was nicht richtig verstanden?

Delphi-Quellcode:
NOTEBOOK
12345678

54812673
BEKNOOOT
Alternativer Code (der Sinn des Parameters S erschließt sich mir nicht ganz):

Delphi-Quellcode:
procedure SortByKey(const Key: string; Dest: TIntegerList);
var
  Ch: Char;
  I: Integer;
  LastKey: Char;
  MinKey: Char;
  MinPos: Integer;
begin
  Dest.Clear;
  LastKey := #0;
  while Dest.Count < Length(Key) do begin
    { suche kleinsten, der größer als LastKey ist, und speichere in MinKey. }
    MinPos := 0;
    for I := 1 to Length(Key) do begin
      Ch := Key[I];
      if (Ch > LastKey) and ((MinPos = 0) or (Ch < MinKey)) then begin
        MinKey := Ch;
        MinPos := I;
      end;
    end;
    { Position anfügen }
    Dest.Add(MinPos);
    { das wird unser neuer LastKey }
    LastKey := MinKey;
    { alle folgenden Positionen anfügen, die gleich LastKey sind }
    for I := MinPos + 1 to Length(Key) do begin
      if Key[I] = LastKey then begin
        Dest.Add(I);
      end;
    end;
  end;
end;
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Bjoerk

Registriert seit: 28. Feb 2011
Ort: Mannheim
1.384 Beiträge
 
Delphi 10.4 Sydney
 
#10

AW: Spaltengenau sortieren

  Alt 11. Jan 2015, 16:08
So isses. Weil nacher weitere strings der gleichen Länge danach sortiert werden. So geht’s z.B. eben nicht.
Delphi-Quellcode:
    for I := 1 to Length(TempKey) - 1 do
      for J := I + 1 to Length(TempKey) do
        if TempKey[I] > TempKey[J] then
        begin
          C := TempKey[I];
          TempKey[I] := TempKey[J];
          TempKey[J] := C;
          Dest.Exchange(I, J);
        end;
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:24 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz