lots of exercises in java... from https://github.com/exercism/java

ChangeCalculator.java 2.1KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. import java.util.*;
  2. import java.util.stream.Collectors;
  3. import static java.util.Comparator.comparingInt;
  4. final class ChangeCalculator {
  5. private final List<Integer> currencyCoins;
  6. ChangeCalculator(final List<Integer> currencyCoins) {
  7. this.currencyCoins = currencyCoins;
  8. Collections.sort(currencyCoins);
  9. }
  10. List<Integer> computeMostEfficientChange(final int grandTotal) {
  11. if (grandTotal < 0) {
  12. throw new IllegalArgumentException("Negative totals are not allowed.");
  13. }
  14. final Map<Integer, List<Integer>> minimalCoinsMap = new HashMap<>();
  15. minimalCoinsMap.put(0, new ArrayList<>());
  16. for (int total = 1; total <= grandTotal; total++) {
  17. final int localTotal = total;
  18. final List<Integer> minimalCoins = getCoinsNoLargerThan(total)
  19. .stream()
  20. .map(coin -> {
  21. final List<Integer> minimalRemainderCoins = minimalCoinsMap.get(localTotal - coin);
  22. return minimalRemainderCoins != null ? prepend(coin, minimalRemainderCoins) : null;
  23. })
  24. .filter(Objects::nonNull)
  25. .sorted(comparingInt(List::size))
  26. .findFirst()
  27. .orElse(null);
  28. minimalCoinsMap.put(localTotal, minimalCoins);
  29. }
  30. final List<Integer> resultCandidate = minimalCoinsMap.get(grandTotal);
  31. if (resultCandidate == null) {
  32. throw new IllegalArgumentException(
  33. "The total " + grandTotal + " cannot be represented in the given currency.");
  34. }
  35. return resultCandidate;
  36. }
  37. private List<Integer> getCoinsNoLargerThan(final int threshold) {
  38. return currencyCoins.stream()
  39. .filter(coin -> coin <= threshold)
  40. .collect(Collectors.toList());
  41. }
  42. private List<Integer> prepend(final int integer, final List<Integer> integers) {
  43. final List<Integer> result = new ArrayList<>();
  44. result.add(integer);
  45. result.addAll(integers);
  46. return result;
  47. }
  48. }