假设我有两个字符串数组,名为'arrayone'和'arraytwo' 我将如何按字母顺序(从A到Z)排序'arrayone',同时仍保持与第二个数组的关系。
你想知道'arrayone'和'arraytwo'是什么,1有姓氏,2有每个人的年龄。我的最终结果是将它添加到一个richedit。
方案示例:
Smith 25
Appleseed 32
Gibbs 45
必须变成:
Appleseed 32
Gibbs 45
Smith 25
请不要使用stringlist,将其保存在简单数组和过程中。
更新:我改用唱片。
尝试此代码无效
for i := 0 to 26 do
for j := 0 to 26 do
if recordname.surname[j] > recordname.surname[j+1] then begin
line := recordname.surname[j];
line[j] := recordname.surname[j+1];
recordname.surname[j+1] := line;
end;
它表示不兼容的类型:'字符'和'字符串'
答案 0 :(得分:17)
在向您提供有关您的数据结构的建议,并看到随后的挣扎之后,我想把事情直截了当地解释清楚我的意思。
原始代码有两个基本上未连接的数组。您可以在一个数组中交换项目,并且很容易忘记为另一个数组执行此操作。在我看来,名字/年龄对真的不应该分开。这导致以下类型声明。
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;
我已经逐一写了这个答案,这就是你应该如何处理这样一个更大的问题。尝试将其分解为更小的部分,每个部分都是可管理的。
答案 1 :(得分:3)
我们的TDynArray
wrapper只是明确处理此功能。
您可以使用自定义排序功能直接就地对任何现有动态数组进行排序,或使用整数索引数组。
function PersonCompare(const Person1, Person2: TPerson): Integer;
begin // sample function pasted from David's answer
Result := CompareText(Person1.Name, Person2.Name);
if Result=0 then
Result := Person2.Age-Person1.Age;
end;
type
TPersonDynArray = array of TPerson;
function SortPersons(var Persons: TPersonDynArray);
var
Person: TDynArray;
begin
Person.Init(TypeInfo(TPersonDynArray),Persons);
Person.Compare := PersonCompare;
Person.Sort;
end;
顺便说一句,包装器的Sort方法将使用优化的Quick Sort,它比Bubble Sort算法快得多。
此包装器中有更多功能,例如类似TList的方法,如Add()或Delete(),使用外部Count变量(更快地添加),序列化或使用散列快速查找。
它适用于Delphi 5到XE2,并且是开源的。
答案 2 :(得分:2)
如果不创建包含两组数据点的新结构,您可以使用基于arrayone检查的比较函数对索引数组进行排序。
更具体地说,最初使用indices
创建一个数组indices[i] = i
。
然后,使用比较函数
对indices
进行排序
i < j iff arrayone[indices[i]] < arrayone[indices[j]]
然后,阅读arrayone[indices[0]], arrayone[indices[1]] ...
会为您提供排序列表,相应的值为arraytwo[indices[0]], arraytwo[indices[1]], ...
答案 3 :(得分:1)
使用您选择的排序算法正常排序第一个数组。任何入门算法教科书都会有几个。每次交换第一个数组的两个条目时,对第二个数组的相应条目进行相同的更改。