首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java:如何将addUp BigDecimal值存储在映射中

Java:如何将addUp BigDecimal值存储在映射中
EN

Stack Overflow用户
提问于 2020-08-14 13:03:02
回答 2查看 107关注 0票数 1

任务是练习收集而不使用流。有一些类似于图书馆的基本功能:我们有关于借阅的读者、书籍和信息。有4类/记录如下:

代码语言:javascript
复制
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

任务:

  • 创建了一张地图,其键为: Reader :用于保持书籍长度的罚款金额(超过14天)。
  • 一个用户可以预订超过1本书。

问题:

  • 我必须增加每个用户的罚款,但我无法做到这一点。我有一种方法可以分别计算每本书的数量..

你能帮帮我吗。下面的主要课程(我在这里很新鲜,所以希望足够多的数据/代码):

代码语言:javascript
复制
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));





}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-08-14 13:20:33

在为读者添加罚款时,您需要记住,-- BigDecimal.add方法返回和,它不修改现有值。

因此,要将新的罚款添加到现有的罚款中,需要检索现有的罚款,添加新的罚款,并将结果存储在readerWithAMountOfFines中。

代码语言:javascript
复制
BigDecimal existingFineAmount = readerWithAMountOfFines.get(borrowing.reader());
BigDecimal newFineAmount = existingFineAmount.add(countFine(borrowing));
readerWithAMountOfFines.put(borrowing.reader(), newFineAmount);
票数 2
EN

Stack Overflow用户

发布于 2020-08-16 20:46:12

我在这里找到了另一个使用合并方法的解决方案

代码语言:javascript
复制
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;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63413309

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档