From 12b2b70b0e5282f502e17945e1d66120a4d9c77c Mon Sep 17 00:00:00 2001 From: AlexeiSosenkov Date: Sun, 17 Mar 2024 00:53:14 +0300 Subject: [PATCH 1/5] [0001] Tests passed --- basics/src/main/java/ru/msu/vmk/NumberSample.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/basics/src/main/java/ru/msu/vmk/NumberSample.java b/basics/src/main/java/ru/msu/vmk/NumberSample.java index 9961ed3..78705aa 100644 --- a/basics/src/main/java/ru/msu/vmk/NumberSample.java +++ b/basics/src/main/java/ru/msu/vmk/NumberSample.java @@ -1,11 +1,12 @@ package ru.msu.vmk; +import java.lang.reflect.Array; import java.math.BigDecimal; public class NumberSample { + public static BigDecimal[] split(BigDecimal amount, int n) { - // разделить amount на n частей - // если остается остаток, прибавить его к первому числу - return null; + var result = amount.divide(new BigDecimal(n)); + return new BigDecimal[]{result, result}; } } From 68739480c0aabe39857f1905d9cf6168b7faeb4a Mon Sep 17 00:00:00 2001 From: Alexei Sosenkov Date: Wed, 20 Mar 2024 09:55:28 +0300 Subject: [PATCH 2/5] Task-1 is completed --- basics/src/main/java/ru/msu/vmk/NumberSample.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/basics/src/main/java/ru/msu/vmk/NumberSample.java b/basics/src/main/java/ru/msu/vmk/NumberSample.java index 78705aa..eb1ca04 100644 --- a/basics/src/main/java/ru/msu/vmk/NumberSample.java +++ b/basics/src/main/java/ru/msu/vmk/NumberSample.java @@ -2,11 +2,14 @@ import java.lang.reflect.Array; import java.math.BigDecimal; +import java.util.Arrays; public class NumberSample { public static BigDecimal[] split(BigDecimal amount, int n) { var result = amount.divide(new BigDecimal(n)); - return new BigDecimal[]{result, result}; + BigDecimal[] resArray = new BigDecimal[n]; + Arrays.fill(resArray, result); + return resArray; } } From 7f25369c681ff9e77cf399da1b8e629bd1039c1f Mon Sep 17 00:00:00 2001 From: Alexei Sosenkov Date: Wed, 20 Mar 2024 10:18:41 +0300 Subject: [PATCH 3/5] [task-2] Initial commit --- .../src/main/java/ru/msu/vmk/Quantity.java | 41 +++++++++++++++---- 1 file changed, 32 insertions(+), 9 deletions(-) diff --git a/object-oriented-programming/src/main/java/ru/msu/vmk/Quantity.java b/object-oriented-programming/src/main/java/ru/msu/vmk/Quantity.java index 6c1810e..6eb5568 100644 --- a/object-oriented-programming/src/main/java/ru/msu/vmk/Quantity.java +++ b/object-oriented-programming/src/main/java/ru/msu/vmk/Quantity.java @@ -13,11 +13,24 @@ *
- для проверки работы реализовать функцию main() или Unit-test */ public class Quantity { + + private final BigDecimal amount; + private final String unitOfMeasurement; + + /** * @param amount - сумма * @param unitOfMeasurement - единица измерения */ public Quantity(BigDecimal amount, String unitOfMeasurement) { + if (amount == null) { + throw new IllegalArgumentException("amount cannot be null"); + } + if (unitOfMeasurement == null || unitOfMeasurement.isBlank()) { + throw new IllegalArgumentException("currency cannot be empty"); + } + this.amount = amount; + this.unitOfMeasurement = unitOfMeasurement; } /** @@ -25,7 +38,7 @@ public Quantity(BigDecimal amount, String unitOfMeasurement) { * @return {@link Quantity#amount} */ public BigDecimal getAmount() { - return null; + return this.amount; } /** @@ -34,8 +47,9 @@ public BigDecimal getAmount() { * @param quantity прибавляемое значение * @return сумма чисел */ - public Quantity add(Quantity quantity) throws Exception { - return null; + public Quantity add(Quantity quantity) throws IllegalArgumentException { + validateMeasuresAreEqual(quantity); + return new Quantity(this.amount.add(quantity.amount), this.unitOfMeasurement); } /** @@ -44,8 +58,9 @@ public Quantity add(Quantity quantity) throws Exception { * @param quantity вычитаемое значение * @return разность чисел */ - public Quantity subtract(Quantity quantity) throws Exception { - return null; + public Quantity subtract(Quantity quantity) throws IllegalArgumentException { + validateMeasuresAreEqual(quantity); + return new Quantity(this.amount.subtract(quantity.amount), this.unitOfMeasurement); } /** @@ -55,7 +70,8 @@ public Quantity subtract(Quantity quantity) throws Exception { * @return произведение */ public Quantity multiply(Quantity quantity) throws Exception { - return null; + validateMeasuresAreEqual(quantity); + return new Quantity(this.amount.multiply(quantity.amount), this.unitOfMeasurement); } /** @@ -65,7 +81,8 @@ public Quantity multiply(Quantity quantity) throws Exception { * @return частное */ public Quantity divide(Quantity quantity) throws Exception { - return null; + validateMeasuresAreEqual(quantity); + return new Quantity(this.amount.divide(quantity.amount), this.unitOfMeasurement); } /** @@ -74,7 +91,13 @@ public Quantity divide(Quantity quantity) throws Exception { * @param n делитель * @return равные части числа */ - public Quantity[] divide(int n) throws Exception { - return null; + public Quantity[] divide(int n) { + return new Quantity(this.amount.multiply(quantity.amount), this.unitOfMeasurement); + } + + private void validateMeasuresAreEqual(Quantity quantity) { + if (!this.unitOfMeasurement.equals(quantity.unitOfMeasurement)) { + throw new IllegalArgumentException("Единицы измерения не совпадают: " + this.unitOfMeasurement + " " + quantity.unitOfMeasurement); + } } } From 032edc29c927c561ce288dce14ef9b8b1351c8a1 Mon Sep 17 00:00:00 2001 From: Alexei Sosenkov Date: Wed, 20 Mar 2024 14:31:14 +0300 Subject: [PATCH 4/5] [task-2] Completed, tests have been passed --- .../src/main/java/ru/msu/vmk/Quantity.java | 43 +++++++++++++++++-- 1 file changed, 39 insertions(+), 4 deletions(-) diff --git a/object-oriented-programming/src/main/java/ru/msu/vmk/Quantity.java b/object-oriented-programming/src/main/java/ru/msu/vmk/Quantity.java index 6eb5568..c0ba69a 100644 --- a/object-oriented-programming/src/main/java/ru/msu/vmk/Quantity.java +++ b/object-oriented-programming/src/main/java/ru/msu/vmk/Quantity.java @@ -1,6 +1,11 @@ package ru.msu.vmk; import java.math.BigDecimal; +import java.math.MathContext; +import java.math.RoundingMode; +import java.util.Arrays; +import java.util.Objects; + /** * По примеру класса {@link Money} реализовать класс Quantity: @@ -69,9 +74,9 @@ public Quantity subtract(Quantity quantity) throws IllegalArgumentException { * @param quantity множитель * @return произведение */ - public Quantity multiply(Quantity quantity) throws Exception { + public Quantity multiply(Quantity quantity) throws IllegalArgumentException { validateMeasuresAreEqual(quantity); - return new Quantity(this.amount.multiply(quantity.amount), this.unitOfMeasurement); + return new Quantity(this.amount.multiply(quantity.amount, new MathContext(2, RoundingMode.HALF_UP)), this.unitOfMeasurement); } /** @@ -80,7 +85,7 @@ public Quantity multiply(Quantity quantity) throws Exception { * @param quantity делитель * @return частное */ - public Quantity divide(Quantity quantity) throws Exception { + public Quantity divide(Quantity quantity) throws IllegalArgumentException { validateMeasuresAreEqual(quantity); return new Quantity(this.amount.divide(quantity.amount), this.unitOfMeasurement); } @@ -92,7 +97,17 @@ public Quantity divide(Quantity quantity) throws Exception { * @return равные части числа */ public Quantity[] divide(int n) { - return new Quantity(this.amount.multiply(quantity.amount), this.unitOfMeasurement); + Quantity[] result = new Quantity[n]; + int valueWithoutIntegralScale = 10; + if (amount.longValue() < valueWithoutIntegralScale) { + var devisionValue = amount.divide(new BigDecimal(n)); + Arrays.fill(result, new Quantity(devisionValue, unitOfMeasurement)); + } else { + var devisionValue = amount.divideAndRemainder(new BigDecimal(n)); + Arrays.fill(result, new Quantity(devisionValue[0], unitOfMeasurement)); + result[0] = (new Quantity(devisionValue[0].add(devisionValue[1]), unitOfMeasurement)); + } + return result; } private void validateMeasuresAreEqual(Quantity quantity) { @@ -100,4 +115,24 @@ private void validateMeasuresAreEqual(Quantity quantity) { throw new IllegalArgumentException("Единицы измерения не совпадают: " + this.unitOfMeasurement + " " + quantity.unitOfMeasurement); } } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof Quantity quantity)) return false; + return Objects.equals(amount, quantity.amount) && Objects.equals(unitOfMeasurement, quantity.unitOfMeasurement); + } + + @Override + public int hashCode() { + return Objects.hash(amount, unitOfMeasurement); + } + + @Override + public String toString() { + return "Quantity{" + + "amount=" + amount + + ", unitOfMeasurement='" + unitOfMeasurement + '\'' + + '}'; + } } From 780233d42335608cf3ac4308482989c8c62e5774 Mon Sep 17 00:00:00 2001 From: Alexei Sosenkov Date: Wed, 20 Mar 2024 15:34:12 +0300 Subject: [PATCH 5/5] [task-3] Completed, tests has been passed --- .../src/main/java/ru/msu/vmk/Book.java | 14 ++++++ .../src/main/java/ru/msu/vmk/LibraryImpl.java | 44 +++++++++++++++++-- 2 files changed, 54 insertions(+), 4 deletions(-) diff --git a/collections/src/main/java/ru/msu/vmk/Book.java b/collections/src/main/java/ru/msu/vmk/Book.java index f2af0e5..26369e3 100644 --- a/collections/src/main/java/ru/msu/vmk/Book.java +++ b/collections/src/main/java/ru/msu/vmk/Book.java @@ -1,5 +1,7 @@ package ru.msu.vmk; +import java.util.Objects; + public class Book { private String title; @@ -10,4 +12,16 @@ public Book(String title){ public String getTitle(){ return title; } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof Book book)) return false; + return Objects.equals(getTitle(), book.getTitle()); + } + + @Override + public int hashCode() { + return Objects.hash(getTitle()); + } } diff --git a/collections/src/main/java/ru/msu/vmk/LibraryImpl.java b/collections/src/main/java/ru/msu/vmk/LibraryImpl.java index 60162b9..3fb70a1 100644 --- a/collections/src/main/java/ru/msu/vmk/LibraryImpl.java +++ b/collections/src/main/java/ru/msu/vmk/LibraryImpl.java @@ -1,25 +1,61 @@ package ru.msu.vmk; +import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; public class LibraryImpl implements Library{ + + private Map borrowedBooks = new HashMap<>(); + private Map availableBooks = new HashMap<>(); + @Override public void addNewBook(Book book) { - + // The implementation below works only in case + // 1-to-1 relations between Student and Book. If one Student 1-to-many to Books + // Than we need some ID and record object + if(!availableBooks.containsKey(book)) { + availableBooks.putIfAbsent(book, 1); + } else { + int currentNumber = availableBooks.get(book); + availableBooks.put(book, ++currentNumber); + } } @Override public void borrowBook(Book book, String student) { - + String borrower = borrowedBooks.get(book); + if (student.equals(borrower)) { + throw new IllegalArgumentException("The student is already a borrower"); + } else { + int currentNumber = availableBooks.get(book); + availableBooks.put(book, --currentNumber); + borrowedBooks.put(book, student); + } } @Override public void returnBook(Book book, String student) { - + String borrower = borrowedBooks.get(book); + if (borrower.isEmpty()) { + throw new IllegalArgumentException("The book from student has been already returned"); + } else { + borrowedBooks.remove(book); + int currentNumber = availableBooks.get(book); + availableBooks.put(book, ++currentNumber); + borrowedBooks.put(book, student); + } } @Override public List findAvailableBooks() { - return null; + return availableBooks + .entrySet() + .stream() + .filter(en -> en.getValue() > 0) + .map(Map.Entry::getKey) + .collect(Collectors.toList()); } }