2011-02-09 17 views
11

Chcę iterować przez zestaw określonych wartości. Prosty przykład poniżejDelphi for..in ustawia kolejność wyliczeń pętli

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. 

przykładowy kod tutaj robi to, czego oczekuję i produkuje następujące

iteracji = 1, wartość = 1

iteracji = 2, wartość = 5

iteracji = 3, wartość = 10

Iteracja = 4, wartość = 20

Teraz, jeśli mogę zmienić kolejność zestawu

for b in [20,10,5,1] do 

Wyjście jest takie samo jak oryginał, czyli kolejność wartości nie jest zachowana.

Jaki jest najlepszy sposób wdrożenia tego?

Odpowiedz

16

Zestawy nie są zamówionymi pojemnikami. Nie można zmienić kolejności zawartości zestawu. Pętla for-in zawsze przechodzi przez zestawy w kolejności numerycznej.

Jeśli potrzebujesz uporządkowanej listy numerów, możesz użyć tablicy lub 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. 
+15

np. 'for b in TIntegerDynArray.Create (20,10,5,1) do' –

+0

Dzięki za odpowiedź. Czy jest jakiś mniej rozwlekły sposób tworzenia uporządkowanych wartości tablicy? I powyższy komentarz również to potwierdza. Czasami StackOverflow jest zbyt szybki :-) – HMcG

+0

Składnia dynamicznych tablic-konstruktorów, którą David demonstruje, jest nowsza niż pętla for-in. Istnieje kilka wersji Delphi, które mogą korzystać z tego drugiego, ale nie pierwszego, a jeśli używasz jednego z nich, to niewiele możesz zrobić. Możesz napisać własną funkcję, która przekształci otwartą tablicę w tablicę dynamiczną. –

5

W matematyce zestaw nie ma określonej kolejności.

W paskale zbiorem jest bitmap w reprezentacji pamięci elementów obecnych w zestawie (w obrębie wszechświata możliwych elementów zdefiniowanych przez typ bazowy).

Nie da się "zmienić" kolejności zestawu, ponieważ z definicji nie ma dla niego znaczenia.

Jako reprezentacja pamięci według pascal, zestaw jest zawsze iterowany "w kolejności".

+0

dzięki za wyjaśnienie. Muszę przyznać, że nie zdawałem sobie sprawy, że jest to, jak mówisz, odwzorowana reprezentacja wartości - to również wyjaśnia, dlaczego zdublowane wartości nie mają żadnego skutku - ta wartość jest już reprezentowana. – HMcG

9

Możesz zadeklarować stałą tablicę zamiast stałego zestawu.

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. 
+0

Kolejna fajna implementacja, a ta nie polega na żadnych innych jednostkach. Dzięki. – HMcG