gpt4 book ai didi

delphi - 列表和包含方法

转载 作者:行者123 更新时间:2023-12-03 15:46:48 28 4
gpt4 key购买 nike

我有这个问题:从一个空列表(0 个元素)开始,我想检查该列表中是否存在某个元素。如果列表中不存在此记录,则我将此记录添加到列表中,否则更新列表中的元素。我尝试编写这段代码:

program Project1;

{$APPTYPE CONSOLE}

{$R *.res}

uses
System.SysUtils, System.Generics.Collections, System.Generics.Defaults;

type
TDBStats = record
Comb: Integer;
Freq: Integer;
end;
TDBStatsList = TList<TDBStats>;

procedure Add(ODBStats: TDBStatsList; const Item: TDBStats);
var
rItem: TDBStats;
begin
rItem := Item;
rItem.Freq := 1;
oDBStats.Add(rItem);
end;

procedure Update(ODBStats: TDBStatsList; const Item: TDBStats; const Index: Integer);
var
rItem: TDBStats;
begin
rItem := Item;
Inc(rItem.Freq);
oDBStats[Index] := rItem;
end;


var
oDBStats: TDBStatsList;
rDBStats: TDBStats;
myArr: array [0..4] of integer;
iIndex1: Integer;
begin
try
myArr[0] := 10;
myArr[1] := 20;
myArr[2] := 30;
myArr[3] := 40;
myArr[4] := 10;

oDBStats := TList<TDBStats>.Create;
try
for iIndex1 := 0 to 4 do
begin
rDBStats.Comb := myArr[iIndex1];
if oDBStats.Contains(rDBStats) then
Update(oDBStats, rDBStats, oDBStats.IndexOf(rDBStats))
else
Add(oDBStats, rDBStats);
end;
// Check List
for iIndex1 := 0 to Pred(oDBStats.Count) do
Writeln(oDBStats[iIndex1].Comb:3, oDBStats[iIndex1].Freq:10);
finally
oDBStats.Free;
end;

except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
Readln;
end.

并且应该返回这个结果:

10     2
20 1
30 1
40 1
50 1

但返回这个结果:

10     1
20 1
30 1
40 1
50 1
10 1

我已经了解问题:当我使用 oDBStats.Contains(rDBStats) 时,它控制 rDBStats 元素是否包含在列表中;第一次没有找到并添加到列表中;但是当它添加到列表中时,我将 freq 字段更新为 1;所以第二次当我再次检查 freq = 0 的 rdbstats 时没有找到它。我能解决这个问题吗?我需要一个计数器,我从输入中得到一个“梳子”,并且我想检查这个“梳子”是否存在于列表中,独立于记录的其他字段的值。如果我在列表中找到“梳子”,那么我会更新,增加频率字段。感谢您的帮助。

最佳答案

当您在通用列表上调用 Contains 时,它会查找给定值是否已在列表内。您的情况中的值是由两个字段组成的记录。由于您没有指定自定义比较器,Delphi 将使用默认比较器,在记录的情况下进行二进制比较。因此,只有当两个记录二进制相等时,它们才会被视为相等。

为了使您的示例正常工作,您必须指定一个仅比较记录的组合字段的自定义比较器。这是一个例子:

oDBStats := TList<TDBStats>.Create(TDelegatedComparer<TDBStats>.Create(
function(const Left, Right: TDBStats): Integer
begin
result := CompareValue(Left.comb, Right.comb);
end));

此外,您的更新例程中存在错误。您不是增加现有值,而是增加 item 参数的未定义值。第一行的更改应该使它起作用:

  rItem := oDBStats[Index];
Inc(rItem.Freq);
oDBStats[Index] := rItem;

关于delphi - 列表和包含方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8862807/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com