POO-ITBA / 2024_02

Consultas 2C 2024
2 stars 0 forks source link

ej2_p2_c2_2024 #21

Open ifrund opened 2 weeks ago

ifrund commented 2 weeks ago

Buenas tardes! Tenía una consulta del ejercicio del título (https://docs.google.com/document/d/1YIFT2mM8OxNUCy605EBaVmfdgqnWM4_MdFS5qqrEa2k/) Hice el ejercicio y las salidas coinciden con las del tester, pero mi implementación es distinta a la de la solución, por lo que adjunto la misma y pido su corrección. Muchas gracias!

public class ReimbursementTracker {

    private final HashMap<String, Client> clients = new HashMap<>();

    private boolean isRegistered(String name){
        return clients.containsKey(name);
    }

    private void clientExists(String name){
        if(!isRegistered(name)){
            throw new IllegalArgumentException("Client is not registered.");
        }
    }

    public void registerClient(String name, int cap){
        if(isRegistered(name)){
            throw new IllegalArgumentException("Client already registered.");
        }
        clients.put(name, new Client(name, cap));
    }

    public int getRemainingReimbursement(String name, YearMonth ym){
        clientExists(name);
        return clients.get(name).getMonthRemainingReimbursements(ym);
    }

    public void addReimbursement(String name, YearMonth ym, int amount){
        clientExists(name);
        clients.get(name).addMonthReimbursements(ym, amount);
    }

    public Set<Map.Entry<YearMonth, Integer>> getReimbursements(String name, YearMonth from, YearMonth toExc){
        clientExists(name);
        return clients.get(name).getReimbursementsRange(from, toExc).entrySet();
    }

}

public class Client {

    private final String name;  //Innecesario, pero lo hago igual.
    private final int cap;      //Tope
    private SortedMap<YearMonth, Integer> reimbursements = new TreeMap<>();

    public Client(String name, int cap){
        this.name=name;
        this.cap=cap;
    }

    public int getMonthReimbursements(YearMonth ym){
        return reimbursements.getOrDefault(ym, 0);
    }

    public void addMonthReimbursements(YearMonth ym, int amount){
        int newReimbursements = getMonthReimbursements(ym) + amount;
        if(newReimbursements > cap){
            throw new IllegalArgumentException("Reimbursement surpasses month cap.");
        }
        reimbursements.put(ym, newReimbursements);
    }

    public int getMonthRemainingReimbursements(YearMonth ym){
        return cap - getMonthReimbursements(ym);
    }

    public Map<YearMonth, Integer> getReimbursementsRange(YearMonth from, YearMonth toExc){
        return reimbursements.subMap(from, toExc);
    }

}
fmeola commented 2 weeks ago

Hola @ifrund La implementación es correcta. En vez de tener dos mapas encapsulaste todo en una clase Client y está muy bien.