Delphi-PRAXiS
Seite 1 von 2  1 2      

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. ;-)


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:38 Uhr.
Seite 1 von 2  1 2      

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