【发布时间】:2012-01-14 14:27:23
【问题描述】:
我有这个问题:从一个空列表(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 元素是否包含在列表中;第一次没有找到并添加到列表中;但是当它被添加到列表中时,我将频率字段更新为 1;所以第二次当我再次检查频率 = 0 的 rdbstats 时没有找到它。 因为我可以解决这个问题?我需要一个计数器,我从输入中得到一个“梳子”,我想检查这个“梳子”是否存在于列表中,独立于记录的另一个字段的值。如果我在列表中找到“comb”,那么我会更新,增加频率字段。 感谢您的帮助。
【问题讨论】:
-
由于随机选择的类型名称,您的代码难以阅读;使用
TDBStatList代替TDBStats,TDBStat代替PDBStats。 -
已完成,希望对您有所帮助。
-
Freq字段值也在Contains方法中进行了测试;只需在rDBStats.Comb := myArr[iIndex1];之后添加rDBStats.Freq := 1;行就可以得到正确的结果,但这不是一般的解决方案;您的列表需要一个不同的比较器。 -
我还是看不到
50 1的输出来自哪里。
标签: delphi delphi-xe2