吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 978|回复: 16
收起左侧

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

 关闭 [复制链接]
冥界3大法王 发表于 2024-3-5 09:10
本帖最后由 冥界3大法王 于 2024-3-5 10:15 编辑


[Delphi] 纯文本查看 复制代码
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[i]);
    if a1 = CheckListBox1.Items[i] then
    begin
       ShowMessage('等于删除!');
      CheckListBox1.Items.Delete(i);
    end
    else
    begin
//      ShowMessage('不等于保留!');
    end;
    a1 := CheckListBox1.Items[i];
  end;
end;


发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

黄色土豆 发表于 2024-3-5 09:17
想问一下,这是什么语言?
4899 发表于 2024-3-5 09:29
infogate 发表于 2024-3-5 09:31
1.变量 a1 没有初始化,在使用它进行比较之前,它的值是不确定的。这将导致错误的结果。
2.代码逻辑错误:在检查项是否重复时,应该是遍历整个列表并将其与之前遇到过的唯一项进行比较,而不是每次都用当前项进行比较。
[Delphi] 纯文本查看 复制代码
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[i]) then
      uniqueItems.Add(CheckListBox1.Items[i]);
  end;

  // 清空原始CheckListBox,并将不重复的项重新添加进去
  CheckListBox1.Clear;
  for j := 0 to uniqueItems.Count - 1 do
    CheckListBox1.Items.Add(uniqueItems[j]);

  // 释放临时字符串列表
  uniqueItems.Free;
end;

免费评分

参与人数 1吾爱币 +1 收起 理由
冥界3大法王 + 1 一测试就报错,和AI回答的格式一样。

查看全部评分

keweiye 发表于 2024-3-5 09:33
在去重按钮的 Click 事件处理程序中使用了一个for循环从后往前遍历 CheckListBox1.Items 数组。在循环体内,您使用 a1 变量存储当前行的值,并与之前行的值进行比较。如果两个值相等,则删除当前行。
但是,这种逻辑存在一个问题:它只会删除相邻的重复项
[Delphi] 纯文本查看 复制代码
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[i]) then
    begin
      ShowMessage('等于删除!');
      CheckListBox1.Items.Delete(i);
    end
    else
    begin
      s.Add(CheckListBox1.Items[i]);
    end;
  end;
  s.Free;
end;
 楼主| 冥界3大法王 发表于 2024-3-5 09:52
keweiye 发表于 2024-3-5 09:33
在去重按钮的 Click 事件处理程序中使用了一个for循环从后往前遍历 CheckListBox1.Items 数组。在循环体内 ...

image.png
一堆错啊。
 楼主| 冥界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;

下面是我用机器+活人修改正确的版本:
[Delphi] 纯文本查看 复制代码
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[i]) = -1 then      //如果该项不在ItemsList中,添加到ItemsList
      begin
        ItemsList.Add(CheckListBox.Items[i]);
      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;
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-24 16:31

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表