Prędzej pamięci… Chodzi mi o to, że:
- zaczynamy od
adres/A/1.jpg
,
- kończymy na
adres/Z/50.jpg
,
- zaczynamy od
adres/AA/1.jpg
,
- kończymy na
adres/ZZ/50.jpg
.
I co teraz? Kończymy na tym adres/ZZ/50.jpg
, czy jedziemy dalej, od adres/AAA/1.jpg
do adres/ZZZ/50.jpg
itd.? No i jeszcze jedna kwestia – czy po AZ
muszą być generowane ciągi z BA
, czy kolejność może być inna?
Jeden z krótszych sposobów to poniższa, rekurencyjna procedurka:
type
TEntriesCharset = set of Char;
TEntriesRangeset = set of UInt8;
{
APath – ścieżka poprzedzająca wygenerowane wpisy
ASubDir – nazwa podkatalogu po APath
ACharset – zbiór znaków używanych do generowania nazw ASubDir
ARangeset – zakres liczb używanych do generowania nazw plików graficznych
ASubDirMaxWidth – maksymalna długość ASubDir
}
procedure Generate(const APath, ASubDir: String; const ACharset: TEntriesCharset; const ARangeset: TEntriesRangeset; ASubDirMaxWidth: UInt8);
var
LChar: Char;
LIndex: UInt8;
begin
for LChar in ACharset do
for LIndex in ARangeset do
WriteLn(APath, ASubDir, LChar, '/', LIndex, '.jpg');
if ASubDir.Length < ASubDirMaxWidth - 1 then
for LChar in ACharset do
Generate(APath, ASubDir + LChar, ACharset, ARangeset, ASubDirMaxWidth);
end;
Do zademonstrowania działania generatora użyłem procedury Writeln, aby móc wygodnie przyjrzeć się wynikom. Tę linijkę musisz sobie zamienić na swoją – w niej wszystkie podciągi są znane, więc możesz je złączyć w jeden łańcuch, a sam łańcuch użyć do tego, do czego go potrzebujesz.
Przykładowe wywołanie procedury:
Generate('adres/', '', ['A' .. 'B'], [1 .. 2], 2);
Prefiksem jest adres/
, domyślnie subkatalog nie posiada żadnej nazwy, więc powinien być podany pusty ciąg, zakres użytych znaków to litery A
i B
, zbiór numerów plików to liczby 1
i 2
, natomiast generator zakończy generowanie wpisów po użyciu wszystkich dwuznakowych kombinacji dla nazw podkatalogów.
Powyższe wywołanie wygeneruje następujące ciągi:
adres/A/1.jpg
adres/A/2.jpg
adres/B/1.jpg
adres/B/2.jpg
adres/AA/1.jpg
adres/AA/2.jpg
adres/AB/1.jpg
adres/AB/2.jpg
adres/BA/1.jpg
adres/BA/2.jpg
adres/BB/1.jpg
adres/BB/2.jpg
Dla wszystkich podstawowych liter, 50 różnych numerów w nazwach plików, a także dla wszystkich dwuznakowych nazw podkatalogów, procedurkę należy wywołać w poniższy sposób:
Generate('adres/', '', ['A' .. 'Z'], [1 .. 50], 2);
Otrzymasz dokładnie 31.100
wyników, natomiast samo ich wygenerowanie będzie trwało co najwyżej 200ms.