问题描述
任务是练习收集并且不使用流。 有一些类似图书馆的基本功能:我们有读者,书籍和有关借书的信息。 有4个类别/记录,其中包括:
public record Book(String title,String author,BigDecimal priceForKeepingLonger) {}
public record Reader(String name,String lastName,int age,BigDecimal fineAmount) {}
public record Borrowing(Book book,Reader reader,LocalDate borrowingDate) {}
psvm
任务:
问题:
请您帮忙。 下面的主类(我在这里比较新鲜,所以希望数据/代码量足够):
public class Main {
static BigDecimal countFine(Borrowing borrowing){
if(borrowing == null){
throw new IllegalArgumentException("Borrowing collections is null");
}
LocalDate todaysDate = LocalDate.Now();
BigDecimal sum = BigDecimal.ZERO;
long howManyDaysBookIsBorrowedAlready = -ChronoUnit.DAYS.between(todaysDate,borrowing.borrowingDate());
BigDecimal amountOfDaysMinus14 = BigDecimal.valueOf(howManyDaysBookIsBorrowedAlready).subtract(BigDecimal.valueOf(14));
if (howManyDaysBookIsBorrowedAlready <=14){
sum = BigDecimal.ZERO;
}
else{
sum = sum.add(BigDecimal.valueOf(5).multiply(amountOfDaysMinus14));
if(borrowing.reader().age() <18){
sum = sum.divide(BigDecimal.valueOf(2));
}
}
return sum;
}
public static Map<Reader,BigDecimal> createMapReaderWithAMountOfFines(Set<Borrowing> borrowings){
if(borrowings == null){
throw new IllegalArgumentException("Borrowing set collections cannot be null");
}
Map<Reader,BigDecimal> readerWithAMountOfFines = new HashMap<>();
borrowings.forEach(borrowing -> {
if(readerWithAMountOfFines.containsKey(borrowing.reader())){
readerWithAMountOfFines.get(borrowing.reader()).add(countFine(borrowing));
}
else {
readerWithAMountOfFines.put(borrowing.reader(),countFine(borrowing));
}
} );
return readerWithAMountOfFines;
}
public static void main(String[] args) {
Reader r1 = new Reader("Tomasz","Knapik",21,BigDecimal.ZERO);
Reader r2 = new Reader("Adrian",16,BigDecimal.ZERO);
Reader r3 = new Reader("Tomasz","Kamel",29,BigDecimal.ZERO);
Reader r4 = new Reader("Ala","Drag",18,BigDecimal.ZERO);
Reader r5 = new Reader("Ola","Was",28,BigDecimal.ZERO);
Reader r6 = new Reader("Ola","Chrzaszcz",35,BigDecimal.ZERO);
HashSet<Reader> readers = new HashSet<>();
Collections.addAll(readers,r1,r2,r3,r4,r5,r6);
Book b1 = new Book("Przedwiosnie","Zeromski",new BigDecimal("5"));
Book b2 = new Book("Pan Tadeusz","Mickiewicz",new BigDecimal("8"));
Book b3 = new Book("Kordian",new BigDecimal("5"));
Book b4 = new Book("Potop","Sienkiewicz",new BigDecimal("10"));
Book b5 = new Book("Lalka","Prus",new BigDecimal("5"));
HashSet<Book> books = new HashSet<>();
Collections.addAll(books,b1,b2,b3,b4,b5);
Borrowing w1 = new Borrowing(b1,LocalDate.of(2020,7,1));
Borrowing w2 = new Borrowing(b1,8,1));
Borrowing w3 = new Borrowing(b2,20));
Borrowing w4 = new Borrowing(b5,1));
Borrowing w5 = new Borrowing(b5,1));
Borrowing w6 = new Borrowing(b4,20));
Borrowing w7 = new Borrowing(b4,6,1));
Borrowing w8 = new Borrowing(b3,18));
HashSet<Borrowing> wypozyczenia = new HashSet<>();
Collections.addAll(wypozyczenia,w1,w2,w3,w4,w5,w6,w7,w8);
Map<Reader,BigDecimal> readerWithAMountOfFines = createMapReaderWithAMountOfFines(wypozyczenia);
readerWithAMountOfFines.forEach((k,v) -> System.out.println(k + " " + v));
}
解决方法
要对读者罚款的地方,您需要记住 BigDecimal.add方法返回总和,它不会修改现有值。
因此,要将新罚款添加到现有罚款中,您需要检索现有罚款,添加新罚款并将结果存储回readerWithAMountOfFines
中:
BigDecimal existingFineAmount = readerWithAMountOfFines.get(borrowing.reader());
BigDecimal newFineAmount = existingFineAmount.add(countFine(borrowing));
readerWithAMountOfFines.put(borrowing.reader(),newFineAmount);
,
我在这里使用合并方法找到了另一个解决方案
public static Map<Reader,BigDecimal> createMapReaderWithAMountOfFines(Set<Borrowing> borrowings){
if(borrowings == null){
throw new IllegalArgumentException("Borrowing set collections cannot be null");
}
Map<Reader,BigDecimal> readerWithAMountOfFines = new HashMap<>();
borrowings.forEach(borrowing -> {
if(readerWithAMountOfFines.containsKey(borrowing.reader())){
readerWithAMountOfFines.merge(borrowing.reader(),countFine(borrowing),BigDecimal::add);
}
else {
readerWithAMountOfFines.put(borrowing.reader(),countFine(borrowing));
}
} );
return readerWithAMountOfFines;
}