删除stringlist中重复记录的问题(0分)

  • 主题发起人 主题发起人 lanbinvivy
  • 开始时间 开始时间
L

lanbinvivy

Unregistered / Unconfirmed
GUEST, unregistred user!
我最初写了下面的函数
procedure DeleteSameNumber;
var
ix,iy,iz: integer;
begin
if listResult.Items.Count < 1 then
exit;
for ix := 0 to listResult.Items.Count - 1 do
for iy := 0 to listResult.Items.Count - 1 do
if (listResult.Items.Strings[iy]= listResult.Items.Strings[ix])and(ix <> iy) then
listResult.Delete(iz);
end
但执行时出错,提示是:... ...index out of bonds... ...
估计是删除一个重复记录后,变量发生变化,而循环任旧如初,所以超出边界。我不知道我这个推测对不对。于是改写为下面的代码:
procedure TfrmSmartVouch.DeleteSameNumber;
var
ix,iy,iz: integer;
begin
if listResult.Items.Count < 1 then
exit;
for ix := 0 to listResult.Items.Count - 1 do
for iy := 0 to listResult.Items.Count - 1 do
if (listResult.Items.Strings[iy]= listResult.Items.Strings[ix])and(ix <> iy) then
listResult.Items.Strings[iy] := 'del'+inttostr(ix)+inttostr(iy);

for iz := listResult.Items.Count - 1 downto 0 do
if Copy(listResult.Items.Strings[iz],1,3) = 'del' then
listResult.Delete(iz);
end
但这段代码运行效率极低,有没有高手指出症结所在并提供一段高明些的代码呀?
小弟先谢谢您了。
 
主要原因是delte后listResult.items.count值已变,当然数组越界.
k := listResult.items.count ;
for ix :=0 to k-1 do
for iy := ix + 1 to k-1 do
if (listResult.Items.Strings[iy]= listResult.Items.Strings[ix]) then
begin
listResult.Delete(iz);
iy := iy -1;
k := k -1;
end

 
谢谢穷则思大哥的关注!
不过编译提示 :assignment to for- loop variable 'iy'
 
思路: TStringList 有排序功能, 先排序,再从上向下遍历比较一遍相邻记录相同则删除其一效率肯定高, (先思考算法再code, 效率最终来自思考)
listresult.sort;//先排序
For listresult.count-1 downto 1 do
if listresult.items=listresult.items[i-1] then
listresult.delete;

..........
 
procedure DeleteSameNumber(var list:TStringList);
var
tmpList1:TStringList;
i:integer;
s:string;
begin
tmpList1:=TStringList.create;
for i:=0 to list.count-1 do
begin
s:=list;
if tmpList1.indexof(s)=-1 then
tmpList1.add(s);
end;
list.clear;
list.assgin(tmpList1);
freeandnil(tmpList1);
end;


 
谢谢KervenLee,xj_lq两位大哥的教导,你们的方法都很好!茅塞顿开矣。
 
哈哈,我因地制宜选择了KervenLee大哥的方法,效率好多了,运行速度提高了近10倍!
xj_lq大哥的方法也不错,一样直观,而且简单,速度应该更快,不过我目前的程序用不上,不过还是要写一个程序测试一下的。
 
用二分法查找,找到后删除,然后复位,再用二分法查找,找到后再删除......
 

Similar threads

I
回复
0
查看
321
import
I
S
回复
0
查看
915
SUNSTONE的Delphi笔记
S
S
回复
0
查看
894
SUNSTONE的Delphi笔记
S
后退
顶部