tdd-java-demo

tdd java demo with micro-commits

git clone https://9o.is/git/tdd-java-demo.git

commit f2284116e901134be3da6616a4291772fd2ea121
parent bff7df3fc7d6924cc4cd7da07bf226f5cf3c90a7
Author: Jul <jul@9o.is>
Date:   Wed, 31 Mar 2021 21:59:35 +0800

use multiset data structure to apply discounts to basket

Diffstat:
Mbuild.gradle | 1+
Msrc/main/java/takehome/Discount.java | 30+++++++++++++++++++++---------
2 files changed, 22 insertions(+), 9 deletions(-)

diff --git a/build.gradle b/build.gradle @@ -10,6 +10,7 @@ repositories { } dependencies { + compile 'com.google.guava:guava:30.1.1-jre' testImplementation 'org.junit.jupiter:junit-jupiter-api:5.6.0' testImplementation 'org.hamcrest:hamcrest:2.2' testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine' diff --git a/src/main/java/takehome/Discount.java b/src/main/java/takehome/Discount.java @@ -1,5 +1,9 @@ package takehome; +import com.google.common.collect.HashMultiset; +import com.google.common.collect.Multiset; +import com.google.common.collect.Multisets; + import java.util.HashMap; import java.util.Map; @@ -22,20 +26,28 @@ public class Discount { return amount; } + @SuppressWarnings("UnstableApiUsage") double getDiscount(Basket basket) { - Map<Item, Integer> frequencies = new HashMap<>(); + Multiset<Item> basketSet = toMultiset(basket.getAmounts()); + Multiset<Item> discountSet = toMultiset(items); - for (Item item : items.keySet()) { - int occurrences = basket.getAmount(item); - int requirement = items.get(item); - int frequency = Math.floorDiv(occurrences, requirement); + int occurrences = 0; + boolean occurrence = Multisets.containsOccurrences(basketSet, discountSet); - frequencies.put(item, frequency); + while (occurrence) { + occurrences++; + basketSet = Multisets.difference(basketSet, discountSet); + occurrence = Multisets.containsOccurrences(basketSet, discountSet); } - int frequency = frequencies.values() - .stream().reduce(Math::min).orElse(0); + return amount * occurrences; + } - return amount * frequency; + private Multiset<Item> toMultiset(Map<Item, Integer> map) { + Multiset<Item> multiset = HashMultiset.create(); + for (Item item : map.keySet()) { + multiset.add(item, map.get(item)); + } + return multiset; } }