如何去除重复项(100分)

  • 主题发起人 主题发起人 冬月
  • 开始时间 开始时间

冬月

Unregistered / Unconfirmed
GUEST, unregistred user!
需要把LISTBOX中的重复项目去掉,要效率最高,请教高手。(请注意是重复的项目去掉,而不是保留唯一项目)比如:
111111111
222222222
222222222
AAAAAAAAA
AAAAAAAAA
AAAAAAAAA
SSSSSSSSS
SSSSSSSSS
去掉重复项目后应该只剩下111111111,谢谢
 
没有最高 只有更高

俺才疏学浅 ,只能循环判断了
 
用asm配合栈操作应该能够提高效率,代码自己写吧
 
可以考虑参考tstringlist的Duplicates属性dupIgnore
 
自己写一段吧
 
取第一行,然后跟其他行比较,如果一样,就删除,然后再取一行,然后在比较...
 
冒泡法,删除
 
一个FOR循环就搞定了,不有没有那个必要。楼主能描述一下开发场景吗
 
看了上面的答复,一眼就可以看出真正的高手就是:

hs-kill


鼓掌....
 
能具体点吗,tstringlist的Duplicates属性dupIgnore
 
一个FOR循环就搞定了,我以前就是这样解决的。
 
关键是dupIgnore决定了添加时的判断

function TStringList.AddObject(const S: string
AObject: TObject): Integer;
begin
if not Sorted then
Result := FCount
else
if Find(S, Result) then {!!这里如果找到重复项}
case Duplicates of
dupIgnore: Exit
{不添加重复项}
dupError: Error(@SDuplicateString, 0);
end;
InsertItem(Result, S, AObject);
end;


{这个是查找是否有重复项的方法}
function TStringList.Find(const S: string
var Index: Integer): Boolean;
var
L, H, I, C: Integer;
begin
Result := False;
L := 0;
H := FCount - 1;
while L <= H do
begin
I := (L + H) shr 1;
C := CompareStrings(FList^.FString, S);
if C < 0 then L := I + 1 else
begin
H := I - 1;
if C = 0 then
begin
Result := True;
if Duplicates <> dupAccept then L := I;
end;
end;
end;
Index := L;
end;


我建议你,最简单省事的方法:
procedure TForm1.Button1Click(Sender: TObject);
var
sl:TStringList;
begin
sl:=TStringList.Create;
try
sl.Duplicates:=dupIgnore;
sl.Sorted:=true;
sl.Assign(listbox1.Items);
listbox1.Items.Assign(sl);
finally
sl.Free;
end;
end;
 
楼上的,请看清楚要求啊,是去掉有重复的项目,而不是保留唯一项目啊,按你的程序出来的结果是
111111111 1111111111
222222222 2222222222
222222222 AAAAAAAAAA
AAAAAAAAA SSSSSSSSSS
AAAAAAAAA ==》 而不是我需要的只有11111111111这一个项目
AAAAAAAAA
SSSSSSSSS
SSSSSSSSS
 
procedure TForm1.Button1Click(Sender: TObject);
var sl1,sl2:TStringList
si1,si2:integer
ss:string;
begin
sl1:=TStringList.Create;
sl2:=TStringList.Create;
for si1:=0 to listbox1.Items.Count-1 do begin
ss:=listbox1.Items[si1];
if sl2.IndexOf(ss)=-1 then begin
si2:=sl1.IndexOf(ss);
if si2=-1 then sl1.Add(ss)
else begin
sl2.Add(ss);
sl1.Delete(si2);
end;
end;
end;
listbox1.Items.Assign(sl1);
sl1.Free;
sl2.Free;
end;
 
var
sl:TStringList;
i,m:integer;
begin
sl:=TStringList.Create;
sl.Duplicates:=dupAccept;
sl.Sorted:=true;
sl.Assign(listbox1.Items);
listbox1.Items.Clear;
i:=sl.Count-2;
m:=0;
while i>=0 do
begin
if SameText(sl,sl[i+1]) then
inc(m)
else if m=0 then
listbox1.Items.Add(sl[i+1])
else
m:=0;
dec(i);
end;
if m=0 then
listbox1.Items.Add(sl[0]);
sl.Free;
end;
 
多人接受答案了。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
2K
DelphiTeacher的专栏
D
后退
顶部