Generowanie listy ścieżek w porządku alfabetycznym

0

Witam,
Mam następującą zagwozdkę. W zasadzie algorytmiczną, ale z przełożeniem na zaprogramowanie w Delphi. Otóż muszę wygenerować listę ścieżek do plików wg następującego wzoru:

adres/A/1.jpg
...
adres/A/50.jpg
adres/B/1.jpg
...
adres/B/50.jpg
...
adres/Z/1.jpg
...
adres/Z/50.jpg
adres/AA/1.jpg
...
adres/AA/50.jpg
adres/AB/1.jpg
...
adres/AB/50.jpg
itd.

Pomoże ktoś, jak to ugryźć?

0

Z tego co pamiętam, funkcje FindFirst i FindNext zwracają wyniki zgodnie z sortowaniem alfabetycznym w kolejności rosnącej, więc wystarczy jak użyjesz podstawowej konstrukcji (dla tych funkcji).

0

Ale mnie nie chodzi o operacje na plikach. Muszę wygenerować takie stringi.

0

Dobrze wiedzieć… :]

A jaki jest warunek zakończenia generowania? Jaka ma być ostatnia wygenerowana ścieżka?

0

Koniec danych. :)

0

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.

0

Powiem tak. Tak jak w Excelu. Czyli A-Z, AA-AZ, BA-BZ, CA-CZ aż do ZA-ZZ, następnie AAA,AAB,AAC itd. Ścieżki będą generowane podczas wypełniania się danymi Grida, ze źródła zewnętrznego.

0

Potrzebujesz odpowiednika next_permutation z C++ – aby móc wygenerować sobie permutacje poczynając od początkowych, a także aby móc sobie później dorobić kolejne permutacje od ostatniej uprzednio wygenerowanej.

Kiedyś napisałem generator słów metodą znaczników. On potrafiłby w pełni sprostać Twoim oczekiwaniom, jednak kod w tym artykule niezbyt się nadaje – pisałem go lata temu i teraz dałbym radę napisać go o wiele lepiej. Ostatnią wersję (nieistniejącą w podanym artykule) działającą o niebo lepiej niż ta w artykule wrzucam do Pastebin. Jeśli chcesz to skorzystaj z tego kodu (ale trzeba go będzie nieco przerobić).

1 użytkowników online, w tym zalogowanych: 0, gości: 1