![]() |
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:
|
AW: Doppelte Strings in einer Liste finden
Zitat:
Schaue mal bitte in Deinen Posteingang. |
AW: Doppelte Strings in einer Liste finden
Zitat:
"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:
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. |
AW: Doppelte Strings in einer Liste finden
Ziemlich wichtigtuerisch Konversationen aus privaten Nachrichten in aller Öffentlichkeit zu diskutieren.
|
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 15:34 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