![]() |
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... |
AW: Doppelte Strings in einer Liste finden
Standardmäßig gibt es das nicht.
Höchstens vielleicht ein Beispiel in einem Forum oder so... |
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:
aus
TDictionary<String, Integer>
Delphi-Quellcode:
befüllen - Integer ist die Anzahl der Vorkommen.
System.Generics.Collections
Dann die <String, Integer>-Paare sortieren, und zwar nach ihrer Anzahl. |
AW: Doppelte Strings in einer Liste finden
Zitat:
|
AW: Doppelte Strings in einer Liste finden
Zitat:
Danke! |
AW: Doppelte Strings in einer Liste finden
|
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; |
AW: Doppelte Strings in einer Liste finden
|
AW: Doppelte Strings in einer Liste finden
Duplikate finden schön und gut. Aber StackOverflow hilft nicht bei ...
Zitat:
|
AW: Doppelte Strings in einer Liste finden
Ich habe diese Lösung implementiert:
Code:
... natürlich müssen noch "=" in den Strings escaped werden, damit sie in der StringList nicht stören...
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; Zitat:
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:23 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz