我知道如何使用dupignore从TStringList中删除重复的字符串以用于排序的Tstringlist.
CallData := TStringList.Create;
CallData.Sorted := True;
Call.Duplicates := dupIgnore;
Run Code Online (Sandbox Code Playgroud)
但在我的情况下,字符串不能排序.
当TStringList有数十万行时,使用FOR循环查找重复项非常慢(也使用indexOF()).
if OpenDialog1.Execute then
begin
Try
y := TStringList.create;
f := TStreamReader.create(OpenDialog1.FileName, TEncoding.UTF8, True);
while not f.EndOfStream do
begin
l := f.ReadLine;
X.Add(l);
end;
g := Tstreamwriter.create('d:\logX.txt', True, TEncoding.UTF8);
for I := 0 to X.count - 1 do
begin
if y.IndexOf(X[I]) = -1 then
y.Add(X[I]);
end;
for j := 0 to y.count - 1 do
g.WriteLine(y[j]);
Finally
f.free;
y.free;
g.free;
End;
end;
Run Code Online (Sandbox Code Playgroud)
有没有更好的方法?
这是我如何处理这个问题:
如果要删除大量重复项,则从字符串列表中重复删除会影响上述性能.这是因为要删除的每个项目都会导致后面的项目向下移动一个索引.您可以通过复制到新列表而不是删除就地来避免这种情况.
或者,你可以这样操作:
Count为零的变量.Count列表的索引中,然后递增Count.Count元素.字典的要点是查找是O(1)操作,因此第二算法具有O(n)时间复杂度.