以下代码错在何处?【已解决】
本帖最后由 冥界3大法王 于 2024-3-5 10:15 编辑procedure TForm7.添加Click(Sender: TObject);
begin
CheckListBox1.Items.Add('选项1');
CheckListBox1.Items.Add('选项1');
CheckListBox1.Items.Add('选项2');
CheckListBox1.Items.Add('选项2');
CheckListBox1.Items.Add('选项1');
CheckListBox1.Items.Add('选项1');
CheckListBox1.Items.Add('选项2');
CheckListBox1.Items.Add('选项2');
CheckListBox1.Items.Add('选项1');
CheckListBox1.Items.Add('选项1');
CheckListBox1.Items.Add('选项2');
CheckListBox1.Items.Add('选项2');
end;
procedure TForm7.去重Click(Sender: TObject);
var
i: Integer;
a1: string;
begin
for i := CheckListBox1.Count - 1 downto 0 do
begin
// ShowMessage('当前行值是:' + CheckListBox1.Items);
if a1 = CheckListBox1.Items then
begin
ShowMessage('等于删除!');
CheckListBox1.Items.Delete(i);
end
else
begin
// ShowMessage('不等于保留!');
end;
a1 := CheckListBox1.Items;
end;
end;
{:301_974:} 想问一下,这是什么语言? 黄色土豆 发表于 2024-3-5 09:17
想问一下,这是什么语言?
delphi 语言 1.变量 a1 没有初始化,在使用它进行比较之前,它的值是不确定的。这将导致错误的结果。
2.代码逻辑错误:在检查项是否重复时,应该是遍历整个列表并将其与之前遇到过的唯一项进行比较,而不是每次都用当前项进行比较。
procedure TForm7.去重Click(Sender: TObject);
var
i, j: Integer;
uniqueItems: TStringList;
begin
// 初始化一个临时字符串列表用于存储不重复的项
uniqueItems := TStringList.Create;
// 遍历CheckListBox中的每一项
for i := 0 to CheckListBox1.Count - 1 do
begin
// 如果当前项不在uniqueItems中,则添加到uniqueItems
if not uniqueItems.Contains(CheckListBox1.Items) then
uniqueItems.Add(CheckListBox1.Items);
end;
// 清空原始CheckListBox,并将不重复的项重新添加进去
CheckListBox1.Clear;
for j := 0 to uniqueItems.Count - 1 do
CheckListBox1.Items.Add(uniqueItems);
// 释放临时字符串列表
uniqueItems.Free;
end; 在去重按钮的 Click 事件处理程序中使用了一个for循环从后往前遍历 CheckListBox1.Items 数组。在循环体内,您使用 a1 变量存储当前行的值,并与之前行的值进行比较。如果两个值相等,则删除当前行。
但是,这种逻辑存在一个问题:它只会删除相邻的重复项
procedure TForm7.去重Click(Sender: TObject);
var
s: TSet<string>;
i: Integer;
begin
s := TSet<string>.Create;
for i := CheckListBox1.Count - 1 downto 0 do
begin
if s.Contains(CheckListBox1.Items) then
begin
ShowMessage('等于删除!');
CheckListBox1.Items.Delete(i);
end
else
begin
s.Add(CheckListBox1.Items);
end;
end;
s.Free;
end; keweiye 发表于 2024-3-5 09:33
在去重按钮的 Click 事件处理程序中使用了一个for循环从后往前遍历 CheckListBox1.Items 数组。在循环体内 ...
一堆错啊。 infogate 发表于 2024-3-5 09:31
1.变量 a1 没有初始化,在使用它进行比较之前,它的值是不确定的。这将导致错误的结果。
2.代码逻辑错误: ...
咋和智谱清言回答的差不多呢? 冥界3大法王 发表于 2024-3-5 09:53
咋和智谱清言回答的差不多呢?
我是用的阿里的通义灵码 Tset<string>是什么东西? infogate 发表于 2024-3-5 09:55
我是用的阿里的通义灵码
@infogate
我是用的阿里的通义灵码
赶紧修改吧,不然版主姥爷正抓典型呢。。
@homejun
Tset<string>是什么东西?
对啊,对啊。我搜索帮助也没找到,怀疑也是机器生成的。
下面也是错误的版本:
procedure TForm7.Button1Click(Sender: TObject);
var
i: Integer;
a1: string;
begin
CheckListBox2.Clear;
for i := CheckListBox1.Count - 1 downto 0 do
begin
if CheckListBox1.Items.IndexOf(CheckListBox1.Items) = -1 then
begin
ShowMessage('不存在!');
CheckListBox2.Items.Add(CheckListBox1.Items);
end;
a1 := CheckListBox1.Items;
end;
end;
下面是我用机器+活人修改正确的版本:
procedure RemoveDuplicatesFromCheckListBox(CheckListBox: TCheckListBox);
var
i, j: Integer;
ItemsList: TStringList;
begin
ItemsList := TStringList.Create;
try
for i := CheckListBox.Items.Count - 1 downto 0 do //遍历CheckListBox中的所有项
begin
if ItemsList.IndexOf(CheckListBox.Items) = -1 then //如果该项不在ItemsList中,添加到ItemsList
begin
ItemsList.Add(CheckListBox.Items);
end
else
begin
CheckListBox.Items.Delete(i); // 如果该项已经在ItemsList中,删除CheckListBox中的重复项
end;
end;
finally
ItemsList.Free; // 释放TStringList对象
end;
end;
procedure TForm7.这个机器加活人修改的的版本正确了Click(Sender: TObject);
begin
RemoveDuplicatesFromCheckListBox(CheckListBox1);
end;
页:
[1]
2