我有這個問題:從一個空列表(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