gpt4 book ai didi

delphi - 从 TStringList 中删除重复行而不在 Delphi 中排序

转载 作者:行者123 更新时间:2023-12-03 14:52:23 32 4
gpt4 key购买 nike

我知道如何使用 dupignore 从 TStringList 中删除重复的字符串以进行排序的 Tstringlist。

CallData := TStringList.Create;
CallData.Sorted := True;
Call.Duplicates := dupIgnore;

但就我而言,字符串不得排序

当 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;

还有更好的办法吗?

最佳答案

这是我解决这个问题的方法:

  1. 创建一个以字符串为键的字典。值类型是什么并不重要。
  2. 以相反的顺序迭代字符串列表。
  3. 对于每个字符串,检查它是否在字典中。
  4. 如果它在字典中,则从字符串列表中删除。否则添加到字典中。

如果要删除大量重复项,则上述方法的性能将因从字符串列表中重复删除而受到影响。这是因为要删除的每一项都会导致后面的项向下移动一个索引。您可以通过复制到新列表而不是就地删除来避免这种情况。

或者,您可以像这样就地操作:

  1. 创建一个以字符串为键的字典。值类型是什么并不重要。
  2. 将名为 Count 的变量初始化为零。
  3. 按正向顺序迭代字符串列表。
  4. 对于每个字符串,检查它是否在字典中。
  5. 如果它在字典中,则不执行任何操作。否则添加到字典中,复制到列表的索引 Count 中,然后递增 Count
  6. 迭代完成后,调整列表大小以包含 Count 元素。

字典的要点是查找是一个 O(1) 操作,因此第二个算法的时间复杂度为 O(n)。

关于delphi - 从 TStringList 中删除重复行而不在 Delphi 中排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47818390/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com