任务是练习收集而不使用流。有一些类似于图书馆的基本功能:我们有关于借阅的读者、书籍和信息。有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", "Knapik", 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", "Mickiewicz",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,r4, LocalDate.of(2020,7,1));
Borrowing w2 = new Borrowing(b1,r1, LocalDate.of(2020,8,1));
Borrowing w3 = new Borrowing(b2,r2, LocalDate.of(2020,7,20));
Borrowing w4 = new Borrowing(b5,r2, LocalDate.of(2020,7,1));
Borrowing w5 = new Borrowing(b5,r3, LocalDate.of(2020,8,1));
Borrowing w6 = new Borrowing(b4,r2, LocalDate.of(2020,7,20));
Borrowing w7 = new Borrowing(b4,r4, LocalDate.of(2020,6,1));
Borrowing w8 = new Borrowing(b3,r5, LocalDate.of(2020,7,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));
}发布于 2020-08-14 13:20:33
在为读者添加罚款时,您需要记住,-- BigDecimal.add方法返回和,它不修改现有值。
因此,要将新的罚款添加到现有的罚款中,需要检索现有的罚款,添加新的罚款,并将结果存储在readerWithAMountOfFines中。
BigDecimal existingFineAmount = readerWithAMountOfFines.get(borrowing.reader());
BigDecimal newFineAmount = existingFineAmount.add(countFine(borrowing));
readerWithAMountOfFines.put(borrowing.reader(), newFineAmount);发布于 2020-08-16 20:46:12
我在这里找到了另一个使用合并方法的解决方案
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;
}https://stackoverflow.com/questions/63413309
复制相似问题