Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Doppelte Strings in einer Liste finden (https://www.delphipraxis.net/191546-doppelte-strings-einer-liste-finden.html)

Tahtu 26. Jan 2017 15:12

Doppelte Strings in einer Liste finden
 
Ich habe eine Liste von Strings, in der jeder String auch mehrfach vorhanden sein kann.

Nun hätte ich gerne die 10 Strings, die am häufigsten in der Liste vorhanden sind.

Gibt es dafür in Delphi etwas fertiges?

In TStringList habe ich keine entsprechende Funktion gefunden...

stahli 26. Jan 2017 15:23

AW: Doppelte Strings in einer Liste finden
 
Standardmäßig gibt es das nicht.
Höchstens vielleicht ein Beispiel in einem Forum oder so...

Der schöne Günther 26. Jan 2017 15:30

AW: Doppelte Strings in einer Liste finden
 
Das ist aber schon ziemlich speziell. Eine TStringList kann man z.B. sortieren lassen, aber du willst ja einiges mehr als nur sortieren.

Ich würde einfach deine Liste (Array, TStringsList, was auch immer) durchgehen und ein
Delphi-Quellcode:
TDictionary<String, Integer>
aus
Delphi-Quellcode:
System.Generics.Collections
befüllen - Integer ist die Anzahl der Vorkommen.

Dann die <String, Integer>-Paare sortieren, und zwar nach ihrer Anzahl.

a.def 26. Jan 2017 15:33

AW: Doppelte Strings in einer Liste finden
 
Zitat:

Zitat von Tahtu (Beitrag 1360059)
Gibt es dafür in Delphi etwas fertiges?

Was wäre von einem Histogramm zu halten?

Tahtu 26. Jan 2017 16:28

AW: Doppelte Strings in einer Liste finden
 
Zitat:

Zitat von Der schöne Günther (Beitrag 1360064)
Ich würde einfach deine Liste (Array, TStringsList, was auch immer) durchgehen und ein
Delphi-Quellcode:
TDictionary<String, Integer>
aus
Delphi-Quellcode:
System.Generics.Collections
befüllen - Integer ist die Anzahl der Vorkommen.

Die Idee find ich gut. Allerdings kann ich das auch mit TStringList realisieren, indem ich auf TStringList.Values zugreife.

Danke!

Rollo62 26. Jan 2017 18:04

AW: Doppelte Strings in einer Liste finden
 
Bei Spring4D gibt es einige Exoten, da könnte was dabei sein.

Rollo

a.def 26. Jan 2017 18:53

AW: Doppelte Strings in einer Liste finden
 
Liste der Anhänge anzeigen (Anzahl: 1)
Wie wäre es hiermit?

Delphi-Quellcode:
procedure TForm1.Button4Click(Sender: TObject);
type
 PHisto = ^THisto;

 THisto = packed record
  sString: string;
  iCount: Integer;
 end;

 function Compare(Item1, Item2: THisto): Integer;
 begin
  Result := THisto(Item2).iCount - THisto(Item1).iCount;
 end;

var
 Histo: PHisto;
 HistoList: TList;
 i, j: Integer;
 bCont: Boolean;
begin
 Memo2.Lines.Clear;

 HistoList := TList.Create;

 try
  for i := 0 to Memo1.Lines.Count - 1 do
   begin
    bCont := True;
    New(Histo);
    Histo^.iCount := 0;
    Histo^.sString := Memo1.Lines.Strings[i];

    for j := 0 to HistoList.Count - 1 do
     begin
      if PHisto(HistoList.Items[j]).sString = Histo^.sString then
       begin
        bCont := False;
        Dispose(PHisto(Histo));
        Break;
       end;
     end;

    if bCont then
     begin
      for j := 0 to Memo1.Lines.Count - 1 do
       begin
        if Memo1.Lines.Strings[j] = Histo^.sString then
         Inc(Histo^.iCount);
       end;

      HistoList.Add(Histo);
     end;
   end;

  HistoList.Sort(@Compare);

  for i := 0 to HistoList.Count - 1 do
   Memo2.Lines.Add(IntToStr(PHisto(HistoList.Items[i]).iCount) + ' - ' + PHisto(HistoList.Items[i]).sString);
 finally
  for i := HistoList.Count - 1 downto 0 do
   begin
    Dispose(PHisto(HistoList.Items[i]));
    HistoList.Delete(i);
   end;

  HistoList.Free;
 end;
end;

t.roller 26. Jan 2017 19:42

AW: Doppelte Strings in einer Liste finden
 
http://stackoverflow.com/questions/2...list-very-fast
http://docwiki.embarcadero.com/Libra...ist.Duplicates

a.def 26. Jan 2017 19:57

AW: Doppelte Strings in einer Liste finden
 
Duplikate finden schön und gut. Aber StackOverflow hilft nicht bei ...
Zitat:

Zitat von Tahtu (Beitrag 1360059)
Nun hätte ich gerne die 10 Strings, die am häufigsten in der Liste vorhanden sind.

Mein Beispiel jedoch schon. Es soll nur zeigen wie man es machen kann.

Tahtu 27. Jan 2017 08:14

AW: Doppelte Strings in einer Liste finden
 
Ich habe diese Lösung implementiert:
Code:
function Compare(List: TStringList; Index1, Index2: Integer): Integer;
begin
  Result := Sign(StrToInt(List.Values[List.Names[Index2]]) - StrToInt(List.Values[List.Names[Index1]]));
end;

procedure HandleMostUsedStrings();
var
  I: Integer;
  S: string;
  SL: StringList;
begin
  SL := TStringList.Create;

  repeat
    S := GetOneString;

    if not TryStrToInt(MostFrequentlyUsed.Values[S], Count) then Count := 0;
    SL.Values[S] := IntToStr(Count + 1);
  until AllStringsGetted;

  SL.CustomSort(Compare);

  for I := SL.Count - 10 to SL.Count - 1 do
    HandleString(SL.Names[I]);

  SL.Free;
end;
... natürlich müssen noch "=" in den Strings escaped werden, damit sie in der StringList nicht stören...

Zitat:

Zitat von a.def (Beitrag 1360090)
Mein Beispiel jedoch schon. Es soll nur zeigen wie man es machen kann.

t.roller wollte einfach sich wichtig machen, indem er zeigt, dass andere zu blöd sind zu suchen, statt eine neue Frage zu stellen. Ging leider in die Hose, indem er zeigte selbst meine Frage nicht verstanden zu haben.

Zitat:

Zitat von t.roller
"Viele Menschen sind zu dumm, die richtigen Fragen zu stellen."

Es ist ein erhabenes Gefühl besser zu sein als andere. Aber wer das zur Schau stellt zeigt nur, dass er wichtig sein möchte - das machen nur dumme Menschen. ;-)

Daniel 27. Jan 2017 08:35

AW: Doppelte Strings in einer Liste finden
 
Zitat:

Zitat von Tahtu (Beitrag 1360118)
t.roller wollte einfach sich wichtig machen, indem er zeigt, dass andere zu blöd sind zu suchen, statt eine neue Frage zu stellen. Ging leider in die Hose, indem er zeigte selbst meine Frage nicht verstanden zu haben.

Na herrlich. :wall:
Schaue mal bitte in Deinen Posteingang.

Tahtu 27. Jan 2017 09:03

AW: Doppelte Strings in einer Liste finden
 
Zitat:

Zitat von Daniel (Beitrag 1360120)
Du merkst selbst, dass dieser Schreibstil nicht zielführend ist und auf allen Seiten nur Ärger verursacht?

Ich merke, dass hier im Forum sehr viele Menschen sind, die ein ausgeprägtes Ego haben und einfach wichtig sein wollen. Du gehörst dazu.

"Zielführend" meint für dich, dass du dich als wichtig präsentieren kannst.

Ich stimme dir vollkommen zu: Mein Schreibstiel führt nicht zu deinem Ziel, weil ich dich und andere als Wichtigtuer entlarve.

Zitat:

Zitat von Daniel (Beitrag 1360120)
Ich muss darauf bestehen, dass Du Dich künftig am Riemen reißt und solche Anfeindungen unterlässt.

Wenn du glaubst, dass du etwas "musst", dann hast du Zwangsvorstellungen: Du glaubst den Zwang zu haben, etwas machen zu müssen. Das ist ein Fall für einen Psychologen oder Psychiater.

Natürlich befindest du dich auch hier im Irrtum: Niemand zwingt dich etwas zu tun - alles was du machst, entscheidest du selbst. Falls das nicht der Fall ist, führst du ein fremdbestimmtes Dasein - auch das ist ein Grund einen Pschologen oder Psychiater um Hilfe zu bitten.

Ich spreche hier offen Neurosen anderer Mensche an, um allen anderen zu helfen sinnloses Geplappere sein zu lassen. Das ist mein Beitrag hier im Forum an sachlichen Themen über Delphi zu diskutieren.

Aber wenn selbst du als Admin daran kein Interesse hast, erklärt das, warum viele andere hier im Forum einfach dir folgen und sich einfach nur wichtig tun wollen.

Es ist nett wichtig zu sein, aber es ist wichtiger nett zu sein. :roll:

Tja, jetzt fühlst du dich vermutlich ertappt und musst deine Macht ausleben, indem du mich sperrst. Damit würdest du aber nur meine Ausführungen bestätigen.

Zacherl 27. Jan 2017 09:06

AW: Doppelte Strings in einer Liste finden
 
Ziemlich wichtigtuerisch Konversationen aus privaten Nachrichten in aller Öffentlichkeit zu diskutieren.

Daniel 27. Jan 2017 09:07

AW: Doppelte Strings in einer Liste finden
 
Die sich selbst erfüllende Prophezeiung.
Man benimmt sich daneben und beschwert sich dann, dass man rausfliegt. :roll: Klar sind nur die anderen Schuld. Immer.


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:01 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