diff --git a/readme.md b/readme.md index df9f380..280dafc 100644 --- a/readme.md +++ b/readme.md @@ -53,7 +53,7 @@ Deze klasse is reeds gegeven en compleet. ### KnapsackUtil.java Deze klasse staat in voor het greedy algoritme. De klasse bevat 1 public static methode fill met een knapsack en een Shop inventaris als argument. -In de fill-methode worden eerst alle producten uit de shop gesorteerd (gebruik hiervoor een methode uit de klasse Collections!). +In de fill-methode worden eerst alle producten uit de pool gesorteerd (gebruik hiervoor een methode uit de klasse Collections!). Vervolgens probeer je deze gesorteerde producten 1 voor 1 toe te voegen aan de Knapsack. ### Robbery.java (main) @@ -65,7 +65,7 @@ Cannot add product [laptop]. Maximum capacity reached. List of products: Product{name='stereo', weight=30.0, price=3000.0} ``` -Voeg ook eens extra producten toe in de shop en/of pas de capaciteit van de Knapsack eens aan. +Voeg ook eens extra producten toe in de pool en/of pas de capaciteit van de Knapsack eens aan. ### EXTRA: KnapsackUtilTest.java Voorzie unittesten voor de fill methode. diff --git a/src/main/java/be/pxl/ja/citytrip/Attraction.java b/src/main/java/be/pxl/ja/citytrip/Attraction.java new file mode 100644 index 0000000..3b06cbd --- /dev/null +++ b/src/main/java/be/pxl/ja/citytrip/Attraction.java @@ -0,0 +1,60 @@ +package be.pxl.ja.citytrip; + +import be.pxl.ja.knapsack.KnapsackItem; + +public class Attraction implements Comparable, KnapsackItem { + private String name; + private double time; + private int rating; + + public Attraction(String name, double time, int rating) { + this.name = name; + this.time = time; + this.rating = rating; + } + + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public double getTime() { + return time; + } + + @Override + public double getWeight() { + return time; + } + + + public void setTime(double time) { + this.time = time; + } + + public int getRating() { + return rating; + } + + public void setRating(int rating) { + this.rating = rating; + } + + @Override + public String toString() { + return "Attraction{" + + "name='" + name + '\'' + + ", time=" + time + + ", rating=" + rating + + '}'; + } + + @Override + public int compareTo(Attraction attraction) { + return attraction.rating - this.rating; + } +} diff --git a/src/main/java/be/pxl/ja/citytrip/LondonAttractions.java b/src/main/java/be/pxl/ja/citytrip/LondonAttractions.java deleted file mode 100644 index d23ee80..0000000 --- a/src/main/java/be/pxl/ja/citytrip/LondonAttractions.java +++ /dev/null @@ -1,17 +0,0 @@ -package be.pxl.ja.citytrip; - -import java.util.ArrayList; -import java.util.List; - -public class LondonAttractions { - - List items = new ArrayList<>(); - - public void add(Attraction item) { - items.add(item); - } - - public List getItems() { - return items; - } -} diff --git a/src/main/java/be/pxl/ja/citytrip/VisitLondon.java b/src/main/java/be/pxl/ja/citytrip/VisitLondon.java index 821a651..bae655c 100644 --- a/src/main/java/be/pxl/ja/citytrip/VisitLondon.java +++ b/src/main/java/be/pxl/ja/citytrip/VisitLondon.java @@ -1,9 +1,13 @@ package be.pxl.ja.citytrip; +import be.pxl.ja.knapsack.Knapsack; +import be.pxl.ja.knapsack.Pool; +import be.pxl.ja.knapsack.KnapsackUtil; + public class VisitLondon { public static void main(String[] args) { - Knapsack knapsack = new Knapsack(2); - LondonAttractions attractions = new LondonAttractions(); + Knapsack knapsack = new Knapsack<>(2); + Pool attractions = new Pool<>(); attractions.add(new Attraction("Westminster Abbey", 0.5, 7)); attractions.add(new Attraction("Globe Theater", 0.5, 6)); diff --git a/src/main/java/be/pxl/ja/knapsack/Knapsack.java b/src/main/java/be/pxl/ja/knapsack/Knapsack.java new file mode 100644 index 0000000..5b851ee --- /dev/null +++ b/src/main/java/be/pxl/ja/knapsack/Knapsack.java @@ -0,0 +1,29 @@ +package be.pxl.ja.knapsack; + +import java.util.ArrayList; +import java.util.List; + +public class Knapsack { + private int maxCapacity; + private List items = new ArrayList<>(); + + public Knapsack(int maxCapacity) { + this.maxCapacity = maxCapacity; + } + + public double getCurrentWeight() { + return items.stream().mapToDouble(KnapsackItem::getWeight).sum(); + } + + public void add(T item) throws KnapsackFullException{ + if (getCurrentWeight() + item.getWeight() > maxCapacity) { + throw new KnapsackFullException("Product " + item.getName() + " past niet in de knapsack."); + } + items.add(item); + } + + public List getItems() { + return items; + } + +} diff --git a/src/main/java/be/pxl/ja/knapsack/KnapsackFullException.java b/src/main/java/be/pxl/ja/knapsack/KnapsackFullException.java new file mode 100644 index 0000000..25c6081 --- /dev/null +++ b/src/main/java/be/pxl/ja/knapsack/KnapsackFullException.java @@ -0,0 +1,8 @@ +package be.pxl.ja.knapsack; + +public class KnapsackFullException extends Exception { // checked exception + + public KnapsackFullException(String message) { + super(message); + } +} diff --git a/src/main/java/be/pxl/ja/knapsack/KnapsackItem.java b/src/main/java/be/pxl/ja/knapsack/KnapsackItem.java new file mode 100644 index 0000000..c6d9c6e --- /dev/null +++ b/src/main/java/be/pxl/ja/knapsack/KnapsackItem.java @@ -0,0 +1,6 @@ +package be.pxl.ja.knapsack; + +public interface KnapsackItem { + double getWeight(); + String getName(); +} diff --git a/src/main/java/be/pxl/ja/knapsack/KnapsackUtil.java b/src/main/java/be/pxl/ja/knapsack/KnapsackUtil.java new file mode 100644 index 0000000..ebe7cc6 --- /dev/null +++ b/src/main/java/be/pxl/ja/knapsack/KnapsackUtil.java @@ -0,0 +1,24 @@ +package be.pxl.ja.knapsack; + +import be.pxl.ja.knapsack.Knapsack; +import be.pxl.ja.knapsack.KnapsackFullException; +import be.pxl.ja.knapsack.KnapsackItem; +import be.pxl.ja.knapsack.Pool; + +import java.util.Collections; +import java.util.List; + +public class KnapsackUtil { + + public static > void fill(Knapsack knapsack, Pool pool) { + List items = pool.getItems(); + Collections.sort(items); // gesorteerd op prijs - duurste eerst + for (T item : items) { + try { + knapsack.add(item); + } catch (KnapsackFullException e) { + System.err.println(e.getMessage()); + } + } + } +} diff --git a/src/main/java/be/pxl/ja/knapsack/Pool.java b/src/main/java/be/pxl/ja/knapsack/Pool.java new file mode 100644 index 0000000..f2f2994 --- /dev/null +++ b/src/main/java/be/pxl/ja/knapsack/Pool.java @@ -0,0 +1,19 @@ +package be.pxl.ja.knapsack; + +import java.util.ArrayList; +import java.util.List; + +public class Pool { + + private List items = new ArrayList<>(); + + public void add(T item) { + items.add(item); + } + + public List getItems() { + return items; + } + + +} diff --git a/src/main/java/be/pxl/ja/robbery/Demo.java b/src/main/java/be/pxl/ja/robbery/Demo.java new file mode 100644 index 0000000..1376586 --- /dev/null +++ b/src/main/java/be/pxl/ja/robbery/Demo.java @@ -0,0 +1,21 @@ +package be.pxl.ja.robbery; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +public class Demo { + + public static void main(String[] args) { + List products = new ArrayList<>(); + products.add(new Product("p1", 12.5, 8.5)); + products.add(new Product("p2", 8.5, 8.5)); + products.add(new Product("p3", 4.5, 8.5)); + products.add(new Product("p4", 17.5, 8.5)); + products.add(new Product("p5", 11.5, 8.5)); + Collections.sort(products); + for (Product p: products) { + System.out.println(p); + } + } +} diff --git a/src/main/java/be/pxl/ja/robbery/Product.java b/src/main/java/be/pxl/ja/robbery/Product.java new file mode 100644 index 0000000..e5d3943 --- /dev/null +++ b/src/main/java/be/pxl/ja/robbery/Product.java @@ -0,0 +1,53 @@ +package be.pxl.ja.robbery; + +import be.pxl.ja.knapsack.KnapsackItem; + +public class Product implements Comparable, KnapsackItem { + private String name; + private double price; + private double weight; + + public Product(String name, double price, double weight) { + this.name = name; + this.price = price; + this.weight = weight; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public double getPrice() { + return price; + } + + public void setPrice(double price) { + this.price = price; + } + + public double getWeight() { + return weight; + } + + public void setWeight(double weight) { + this.weight = weight; + } + + @Override + public String toString() { + return "Product{" + + "name='" + name + '\'' + + ", price=" + price + + ", weight=" + weight + + '}'; + } + + @Override + public int compareTo(Product product) { + return Double.compare(product.getPrice(), this.getPrice()); + } +} diff --git a/src/main/java/be/pxl/ja/robbery/Robbery.java b/src/main/java/be/pxl/ja/robbery/Robbery.java index 5b04c30..7f6268c 100644 --- a/src/main/java/be/pxl/ja/robbery/Robbery.java +++ b/src/main/java/be/pxl/ja/robbery/Robbery.java @@ -1,13 +1,21 @@ package be.pxl.ja.robbery; +import be.pxl.ja.knapsack.Knapsack; +import be.pxl.ja.knapsack.KnapsackUtil; +import be.pxl.ja.knapsack.Pool; + +import java.util.ArrayList; +import java.util.List; + public class Robbery { public static void main(String[] args) { - Knapsack knapsack = new Knapsack(35); + List woorden = new ArrayList<>(); + Knapsack knapsack = new Knapsack<>(35); - Shop shop = new Shop(); - shop.add(new Product("stereo", 30, 3000)); - shop.add(new Product("laptop", 20, 2000)); - shop.add(new Product("guitar", 15, 1500)); + Pool shop = new Pool<>(); + shop.add(new Product("stereo", 3000, 30)); + shop.add(new Product("laptop", 2000, 20)); + shop.add(new Product("guitar", 1500, 15)); KnapsackUtil.fill(knapsack, shop); diff --git a/src/main/java/be/pxl/ja/robbery/Shop.java b/src/main/java/be/pxl/ja/robbery/Shop.java deleted file mode 100644 index 4f7a304..0000000 --- a/src/main/java/be/pxl/ja/robbery/Shop.java +++ /dev/null @@ -1,19 +0,0 @@ -package be.pxl.ja.robbery; - -import java.util.ArrayList; -import java.util.List; - -public class Shop { - - List items = new ArrayList<>(); - - public void add(Product item) { - items.add(item); - } - - public List getItems() { - return items; - } - - -} diff --git a/src/test/java/be/pxl/ja/citytrip/AttractionTest.java b/src/test/java/be/pxl/ja/citytrip/AttractionTest.java new file mode 100644 index 0000000..bfd288c --- /dev/null +++ b/src/test/java/be/pxl/ja/citytrip/AttractionTest.java @@ -0,0 +1,30 @@ +package be.pxl.ja.citytrip; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; + +public class AttractionTest { + + @Test + public void compareToReturnsZeroForAttractionsWithSameRating() { + Attraction attraction1 = new Attraction("attraction1", 0.5, 5); + Attraction attraction2 = new Attraction("attraction2", 1, 5); + assertEquals(0, attraction1.compareTo(attraction2)); + } + + @Test + public void compareToReturnsNegativeValueForAttractionWithHigherRating() { + Attraction attraction1 = new Attraction("attraction1", 0.5, 7); + Attraction attraction2 = new Attraction("attraction2", 1, 5); + assertTrue(attraction1.compareTo(attraction2) < 0); + } + + @Test + public void compareToReturnsPositiveValueForAttractionWithLowerRating() { + Attraction attraction1 = new Attraction("attraction1", 0.5, 3); + Attraction attraction2 = new Attraction("attraction2", 1, 5); + assertTrue(attraction1.compareTo(attraction2) > 0); + } +} diff --git a/src/test/java/be/pxl/ja/robbery/KnapsackTest.java b/src/test/java/be/pxl/ja/robbery/KnapsackTest.java new file mode 100644 index 0000000..51a2b12 --- /dev/null +++ b/src/test/java/be/pxl/ja/robbery/KnapsackTest.java @@ -0,0 +1,49 @@ +package be.pxl.ja.robbery; + +import be.pxl.ja.knapsack.Knapsack; +import be.pxl.ja.knapsack.KnapsackFullException; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class KnapsackTest { + + private Knapsack knapsackWithProducts; + + @BeforeEach + public void init() throws KnapsackFullException { + knapsackWithProducts = new Knapsack(35); + knapsackWithProducts.add(new Product("p1", 12.5, 8.5)); + knapsackWithProducts.add(new Product("p2", 8.5, 5.5)); + knapsackWithProducts.add(new Product("p3", 15, 7.5)); + } + + @Test + public void emptyKnapsackHasWeightZero() { + Knapsack knapsack = new Knapsack(35); + assertEquals(0, knapsack.getCurrentWeight()); + } + + @Test + public void knapsackWithProductReturnsCorrectWeight() { + assertEquals(21.5, knapsackWithProducts.getCurrentWeight()); + } + + @Test + public void addProductToKnapsack() throws KnapsackFullException{ + int initialSize = knapsackWithProducts.getItems().size(); + double initialWeight = knapsackWithProducts.getCurrentWeight(); + knapsackWithProducts.add(new Product("p4", 25.3, 6.5)); + assertEquals(initialSize + 1, knapsackWithProducts.getItems().size()); + assertEquals(initialWeight + 6.5, knapsackWithProducts.getCurrentWeight()); + } + + + @Test + public void addProductThrowsKnapsackFullExceptionWhenCapacityExceeded() { + Assertions.assertThrows(KnapsackFullException.class, + () -> knapsackWithProducts.add(new Product("p5", 25.5, 30))); + } +} diff --git a/src/test/java/be/pxl/ja/robbery/ProductTest.java b/src/test/java/be/pxl/ja/robbery/ProductTest.java new file mode 100644 index 0000000..fd3059c --- /dev/null +++ b/src/test/java/be/pxl/ja/robbery/ProductTest.java @@ -0,0 +1,24 @@ +package be.pxl.ja.robbery; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +public class ProductTest { + + @Test + public void twoProductsWithEqualPriceReturnZero() { + Product product1 = new Product("Product 1", 12.5, 15.5); + Product product2 = new Product("Product 2", 12.5, 20.25); + Assertions.assertEquals(0, product1.compareTo(product2)); + } + + @Test + public void twoProductsWithDifferentPrice() { + Product product1 = new Product("Product 1", 25.6, 15.5); + Product product2 = new Product("Product 2", 12.5, 20.25); + Assertions.assertEquals(-1, product1.compareTo(product2)); + Assertions.assertEquals(1, product2.compareTo(product1)); + } + + +}