我想迭代一组特定的值。下面的简单例子
program Project1;
{$APPTYPE CONSOLE}
var
a, b: word;
wait: string;
begin
a := 0;
for b in [1,5,10,20] do
begin
a := a + 1;
writeln('Iteration = ', a, ', value = ', b);
end;
read(wait);
end.
此处的示例代码符合我的预期,并生成以下内容
迭代= 1,值= 1
迭代= 2,值= 5
迭代= 3,值= 10
迭代= 4,值= 20
现在,如果我改变集合的顺序
for b in [20,10,5,1] do
输出与原始输出相同,即不保留值的顺序。
实施此方法的最佳方法是什么?
答案 0 :(得分:19)
集合不是有序容器。您无法更改集合内容的顺序。 for-in循环总是按数字顺序迭代集合。
如果您需要有序的数字列表,则可以使用数组或TList<Integer>
。
var
numbers: array of Word;
begin
SetLength(numbers, 4);
numbers[0] := 20;
numbers[1] := 10;
numbers[2] := 5;
numbers[3] := 1;
for b in numbers do begin
Inc(a);
Writeln('Iteration = ', a, ', value = ', b);
end;
end.
答案 1 :(得分:11)
您可以声明一个常量数组而不是常量数组。
program Project1;
{$APPTYPE CONSOLE}
var
a, b: word;
wait: string;
const
values: array[0..3] of word = (20,5,10,1);
begin
a := 0;
for b in values do
begin
a := a + 1;
writeln('Iteration = ', a, ', value = ', b);
end;
read(wait);
end.
答案 2 :(得分:5)
在数学中,一组没有特定的顺序。
在pascal中,集合是集合中存在的元素的内存表示中的bitmap
(在由基类型定义的可能元素的范围内)。
你无法“改变”一组的顺序,因为根据定义,它对它毫无意义。
作为pascal的内存表示,该集合总是“按顺序”迭代。