冥界3大法王 发表于 2024-3-5 09:10

以下代码错在何处?【已解决】

本帖最后由 冥界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

想问一下,这是什么语言?

4899 发表于 2024-3-5 09:29

黄色土豆 发表于 2024-3-5 09:17
想问一下,这是什么语言?

delphi 语言

infogate 发表于 2024-3-5 09:31

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;

keweiye 发表于 2024-3-5 09:33

在去重按钮的 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;

冥界3大法王 发表于 2024-3-5 09:52

keweiye 发表于 2024-3-5 09:33
在去重按钮的 Click 事件处理程序中使用了一个for循环从后往前遍历 CheckListBox1.Items 数组。在循环体内 ...


一堆错啊。

冥界3大法王 发表于 2024-3-5 09:53

infogate 发表于 2024-3-5 09:31
1.变量 a1 没有初始化,在使用它进行比较之前,它的值是不确定的。这将导致错误的结果。
2.代码逻辑错误: ...

咋和智谱清言回答的差不多呢?

infogate 发表于 2024-3-5 09:55

冥界3大法王 发表于 2024-3-5 09:53
咋和智谱清言回答的差不多呢?

我是用的阿里的通义灵码

homejun 发表于 2024-3-5 10:02

Tset<string>是什么东西?

冥界3大法王 发表于 2024-3-5 10:15

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
查看完整版本: 以下代码错在何处?【已解决】