Projekt Basket Splitter rozdziela listę produktów między dostawców, bazując na problemie pokrycia zbioru (Set Cover Problem), będącym wyzwaniem NP-trudnym. W klasie SplittingAlgorithm, algorytm generuje kombinacje dostawców, starając się maksymalizować ilość produktów dostarczanych przez każdego z nich. DeliveryCapabilityChecker ocenia, które kombinacje mogą dostarczyć wszystkie produkty, a SupplierProductAssigner finalizuje przydział produktów.
Klasy Główne:
BasketSplitter: Klasa główna odpowiedzialna za dzielenie listy przedmiotów na grupy według dostawców zgodnie z załadowaną konfiguracją.
Klasy Pomocnicze:
ProductSupplierLoader: Wczytuje konfigurację z pliku JSON, mapując produkty na ich dostawców..
Klasy Algorytmiczne:
DeliveryCapabilityChecker: Analizuje i określa najbardziej zdolnego dostawcę do dostarczenia wszystkich przedmiotów, SplittingAlgorithm: Zawiera algorytm do znajdowania optymalnego przydziału dostawców dla danego zestawu przedmiotów., SupplierProductAssigner:Przydziela produkty dostawcom z preferencją dla konkretnego dostawcy.
Klasa Rekordu:
Product, Supplier, SupplierDeliveryInfo (wewnątrz DeliveryCapabilityChecker).
Wyjątek:
ItemNotFoundException.
Budowanie z Gradle
W terminalu projektu uruchom:
./gradlew buildTo skompiluje kod i utworzy plik JAR.
Tworzenie Fat-JAR
Dodaj plugin ShadowJar w build.gradle i wykonaj:
./gradlew shadowJarZnajdziesz fat-JAR w build/libs.
Dodanie jako Zależność
Umieść fat-JAR w folderze libs Twojego projektu i dodaj w build.gradle:
dependencies {
implementation files('libs/BasketSplitter-1.0-SNAPSHOT-all.jar')
}- testOptimalCourierSelection: Testuje, czy klasa
BasketSplitterprawidłowo wybiera najbardziej optymalnego dostawcę dla podanej listy produktów, weryfikując, czy rozmiar największego koszyka wynosi 2. - testIllegalArgumentExceptionForEmptyItemList: Sprawdza, czy metoda
splitklasyBasketSplitterrzuca wyjątekIllegalArgumentException, gdy przekazana jest pusta lista przedmiotów. - testCourierCapacityEvaluation: Weryfikuje, czy algorytm klasy
BasketSplitterprawidłowo ocenia pojemność kurierów. - testItemNotFoundExceptionForMissingItems: Sprawdza, czy klasa
BasketSplitterzgłasza wyjątekItemNotFoundExceptiondla przedmiotów, które nie są obecne w mapie produktów do dostawców. - testReadJsonFile (w
ProductSupplierLoaderTest): Testuje czy metodareadJsonFileklasyProductSupplierLoaderpoprawnie odczytuje dane JSON.
ProductSupplierLoader: RzucaRuntimeException, gdy nie znajdzie pliku konfiguracyjnego lub wystąpią inne błędy odczytu pliku.- Konstruktor
BasketSplitter: RzucaIllegalStateException, jeśli wystąpi problem z załadowaniem konfiguracji przezProductSupplierLoader. - Metoda
SplitwBasketSplitter: RzucaIllegalArgumentException, gdy lista przedmiotów jest pusta lub null orazRuntimeExceptioniItemNotFoundExceptionw przypadku ogólnych błędów przetwarzania lub braku przedmiotu w konfiguracji.