1
我有3个记录的ClientDataSet与结构:Delphi的时间图分裂算法
货号:整数;开始:TTime;结束:TTime;
1; 9:00; 10:00 2; 9:30; 10:00 3; 9:40; 10:20
我必须让那些记录到其他的ClientDataSet这样的:
1; 9:00; 9:30 2: 9:30; 9:40 3; 9:40; 10:00 4; 10:00; 10:20
我有3个记录的ClientDataSet与结构:Delphi的时间图分裂算法
货号:整数;开始:TTime;结束:TTime;
1; 9:00; 10:00 2; 9:30; 10:00 3; 9:40; 10:20
我必须让那些记录到其他的ClientDataSet这样的:
1; 9:00; 9:30 2: 9:30; 9:40 3; 9:40; 10:00 4; 10:00; 10:20
使用TList<TTime>
,有两列填充它,排序,然后在列表中跳过重复迭代。喜欢这个。
var l: TList<TTime>; t1, t2: TTime; id2: cardinal;
begin
l := TList<TTime>.Create;
try
cds1.First;
while not cds1.Eof do begin
l.Add(Frac(cds1.Fields[1].AsDateTime));
l.Add(Frac(cds1.Fields[2].AsDateTime));
cds1.Next;
end;
l.Sort;
cds2.Clear;
if l.Count <= 0 then exit;
t1 := l[0]; id2 := 0;
for t2 in l do begin
if t1 > t2 then raise Exception.create ('Sort silently failed!') else
if t1 < t2 then begin
Inc(id2);
cds2.AppendRecord([ id2, t1, t2 ]);
t1 := t2;
end;
end;
finally
l.Free;
end;
end;
在描述算法要求时,你必须做的不仅仅是提供输入和输出数据的样本。我们必须猜测算法在这里 - 可能有很多算法为给定的数据提供正确的答案,但只有一个算法能够满足您的要求。用语言解释你需要完成的事情。我的第一个猜测是,您正尝试生成一个最小化的非重叠时间间隔列表,您可以将这些时间间隔重叠为重叠事件。它是否正确? – 2013-02-26 13:52:39
看起来像学校课堂作业? – 2013-02-26 15:02:38
您可以使用SQL而不是Delphi。有关详细信息,请参阅UNION和OVER文档。 – Abelisto 2013-02-26 15:19:04