我有这个问题:从一个空列表(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没有发现它。 正如我可以解决这个问题?我需要一个计数器,我从输入中得到一个“梳子”,我想检查这个“梳子”是否出现在列表中,从记录的另一个字段的值中显示出来。如果我在列表中找到“梳子”,那么我会更新freq字段。 感谢您的帮助。
由于随机选择的类型名称,您的代码很难阅读;使用'TDBStatList'而不是'TDBStats','TDBStat'而不是'PDBStats'。 – kludg 2012-01-14 14:39:01
完成,所以我希望它可以帮助更好。 – 2012-01-14 14:46:46
'Freq'字段值也在'Contains'方法中测试;简单地在'rDBStats.Comb:= myArr [iIndex1];'之后添加'rDBStats.Freq:= 1;'行;给出正确的结果,但这不是一般的解决方案;你需要一个不同的比较器作为你的列表。 – kludg 2012-01-14 15:05:34