gpt4 book ai didi

delphi - 在数组或列表中按 GroupID 对元素进行分组?

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

我做了一个简化的演示(带有伪结构)来说明我需要什么:

type
TMyRec = record
GroupID: Integer;
Color: TColor;
end;

TMyRecArray = array of TMyRec;

我的输入数组/列表元素由非零 GroupID 组成。它们总是按 GroupID 分组(但未排序且无法排序):

GroupID
-------
2
2
2
1
1
3
3
etc...

每个元素都有一个颜色。我的输出应该按 GroupID 分组,并且应该如下所示(其中每个组是 clRed/clGreen - 依次交替):

GroupID ; Color
------- -----
2 ; clRed
2 ; clRed
2 ; clRed
1 ; clGreen
1 ; clGreen
3 ; clRed
3 ; clRed
etc...
9 ; clGreen
7 ; clRed
7 ; clRed

我使用的代码:

procedure TForm1.Button1Click(Sender: TObject);
var
R: TMyRecArray;
I: Integer;
S: string;
OldId: Integer;
begin
// populate some data
SetLength(R, 7);
R[0].GroupID := 2;
R[1].GroupID := 2;
R[2].GroupID := 2;
R[3].GroupID := 1;
R[4].GroupID := 1;
R[5].GroupID := 3;
R[6].GroupID := 3;

OldId := 0;
for I := 0 to High(R) do
begin
if OldId <> R[I].GroupID then
begin
OldId := R[I].GroupID;
R[I].Color := clRed;
end
else
begin
R[I].Color := clGreen;
end;
end;

Memo1.Clear;
for I := 0 to High(R) do
begin
ColorToIdent(R[I].Color, S);
Memo1.Lines.Add(Format('%d ; %s', [R[I].GroupID, S]));
end;
end;

结果正确:

2 ; clRed
2 ; clGreen
2 ; clGreen
1 ; clRed
1 ; clGreen
3 ; clRed
3 ; clGreen

我错过了什么?我知道解决方案很简单,但我就是无法集中精力。
限制:我只能迭代一次;我无法提前阅读/以前的记录。

最佳答案

“分而治之。”您可以将属性的收集和应用颜色与决策分开。

  OldId := 0; GroupNo := 0;
for I := Low(R) to High(R) do
begin
if (OldId <> R[I].GroupId) or (GroupNo = 0) then
begin
OldId := R[I].GroupId;
Inc(GroupNo);
ItemNo := 0;
end;
Inc(ItemNo);

R[I].Color := GroupColor(OldId, GroupNo, ItemNo);
end;

然后您就可以专注于选择本身,而不必担心实际着色、数据迭代等细节。这也将使您更加灵活地了解您的实际需求。 GroupColor 甚至可以是一个变量,根据设置实现不同的突出显示模式。

您想要逐组交替颜色吗?

  function GroupColor(const Id, Number, Item: integer): TColor;
begin
if Odd(Number)
then Result := clRed
else Result := clGreen
end;

或者你想要不同的组有不同的颜色吗?

  function GroupColor(const Id, Number, Item: integer): TColor;
begin
case Id of
1: Result := clRed;
2: Result := clYellow;
3: Result := clBlue;
4: Result := clGreen;
else Result := clWhite;
end;
end;

或者你想强调每个组的高层、领导者?

  function GroupColor(const Id, Number, Item: integer): TColor;
begin
case Item of
1: Result := clRed;
2: Result := clYellow;
3: Result := clGreen;
else Result := clGray;
end;
end;

关于delphi - 在数组或列表中按 GroupID 对元素进行分组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19930232/

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