给了你关于你的数据结构的建议,并看到了随后的挣扎,我想把事情弄直,并更清楚地解释我的意思。
你原来的代码有两个基本上没有连接的数组。您可以交换一个数组中的项目,并且很容易忘记为另一个数组执行此操作。它看起来像名字/年龄对真的不应该分开。这导致下面的类型声明。
type
TPerson = record
Name: string;
Age: Integer;
end;
现在您需要持有一个TPerson
的数组。
type
TPersonArray = array of TPerson;
为了执行排序,您需要能够比较两个项目并交换它们。
function Compare(const Person1, Person2: TPerson): Integer;
begin
Result := CompareText(Person1.Name, Person2.Name);
end;
procedure Swap(var Person1, Person2: TPerson);
var
temp: TPerson;
begin
temp := Person1;
Person1 := Person2;
Person2 := temp;
end;
现在我们可以把这一切与泡沫排序在一起。现在
procedure Sort(var People: TPersonArray);
var
i, n: Integer;
Swapped: Boolean;
begin
n := Length(People);
repeat
Swapped := False;
for i := 1 to n-1 do begin
if Compare(People[i-1], People[i])>0 then begin
Swap(People[i-1], People[i]);
Swapped := True;
end;
end;
dec(n);
until not Swapped;
end;
,如果你想使用更复杂的比较操作,那么你可以简单地更换Compare
。例如,如果您想按年龄排列任何具有相同名称的人,则使用字典对照功能。
function Compare(const Person1, Person2: TPerson): Integer;
begin
Result := CompareText(Person1.Name, Person2.Name);
if Result=0 then begin
Result := Person2.Age-Person1.Age;
end;
end;
我已经一个一个地写了这个答案,这就是你应该如何处理这样一个更大的问题。尝试把它分解成更小的部分,每个部分都是可管理的。
您的数据结构错误。你没有两个数组。你有一个单一的数组,每个元素是一个名称,值对。在继续之前,请考虑切换到正确的数据结构。 –
@David,我有两个数组。我将如何将它合并到一个多维数组中,然后继续? – noob
你想'记录数组'。在现代Delphi中,你可以使用'TList'。 –