import com.google.common.collect.*;
import java.util.*;
public class Main {
public static class Transaction {
public final double amount;
public final String transactionType
;
public Transaction
(double amount,
String transactionType,
String date
) { this.amount = amount;
this.transactionType = transactionType;
this.date = date;
}
}
public static void processTransactions(List<Transaction> transactions) {
// Filter by Credit Transactions
ImmutableList<Transaction> creditTransactions = FluentIterable.from(transactions)
.filter(t -> t.transactionType.equals("Credit"))
.toList();
// Group by Date
ImmutableListMultimap
<String, Transaction
> transactionsByDate
= Multimaps.
index(creditTransactions, t
-> t.
date);
// Calculate and print the average for each date
for (String date
: transactionsByDate.
keySet()) { Collection<Transaction> dateTransactions = transactionsByDate.get(date);
double averageAmount = dateTransactions.stream()
.mapToDouble(t -> t.amount)
.average()
.orElse(0.0);
System.
out.
printf("%s - %.2f$\n", date, averageAmount
); }
}
public static void main
(String[] args
) { List
<Transaction
> transactions
= Arrays.
asList( new Transaction(500, "Credit", "2023-05-27"),
new Transaction(1500, "Debit", "2023-04-06"),
new Transaction(1800, "Credit", "2023-08-06"),
new Transaction(250, "Credit", "2023-05-27"),
new Transaction(500, "Debit", "2023-05-27")
);
processTransactions(transactions);
}
}
aW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuKjsKaW1wb3J0IGphdmEudXRpbC4qOwoKcHVibGljIGNsYXNzIE1haW4gewogICAgCiAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFRyYW5zYWN0aW9uIHsKICAgICAgICBwdWJsaWMgZmluYWwgZG91YmxlIGFtb3VudDsKICAgICAgICBwdWJsaWMgZmluYWwgU3RyaW5nIHRyYW5zYWN0aW9uVHlwZTsKICAgICAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGRhdGU7CgogICAgICAgIHB1YmxpYyBUcmFuc2FjdGlvbihkb3VibGUgYW1vdW50LCBTdHJpbmcgdHJhbnNhY3Rpb25UeXBlLCBTdHJpbmcgZGF0ZSkgewogICAgICAgICAgICB0aGlzLmFtb3VudCA9IGFtb3VudDsKICAgICAgICAgICAgdGhpcy50cmFuc2FjdGlvblR5cGUgPSB0cmFuc2FjdGlvblR5cGU7CiAgICAgICAgICAgIHRoaXMuZGF0ZSA9IGRhdGU7CiAgICAgICAgfQogICAgfQoKICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBwcm9jZXNzVHJhbnNhY3Rpb25zKExpc3Q8VHJhbnNhY3Rpb24+IHRyYW5zYWN0aW9ucykgewogICAgICAgIC8vIEZpbHRlciBieSBDcmVkaXQgVHJhbnNhY3Rpb25zCiAgICAgICAgSW1tdXRhYmxlTGlzdDxUcmFuc2FjdGlvbj4gY3JlZGl0VHJhbnNhY3Rpb25zID0gRmx1ZW50SXRlcmFibGUuZnJvbSh0cmFuc2FjdGlvbnMpCiAgICAgICAgICAgICAgICAuZmlsdGVyKHQgLT4gdC50cmFuc2FjdGlvblR5cGUuZXF1YWxzKCJDcmVkaXQiKSkKICAgICAgICAgICAgICAgIC50b0xpc3QoKTsKICAgICAgICAKICAgICAgICAvLyBHcm91cCBieSBEYXRlCiAgICAgICAgSW1tdXRhYmxlTGlzdE11bHRpbWFwPFN0cmluZywgVHJhbnNhY3Rpb24+IHRyYW5zYWN0aW9uc0J5RGF0ZSA9IE11bHRpbWFwcy5pbmRleChjcmVkaXRUcmFuc2FjdGlvbnMsIHQgLT4gdC5kYXRlKTsKCiAgICAgICAgLy8gQ2FsY3VsYXRlIGFuZCBwcmludCB0aGUgYXZlcmFnZSBmb3IgZWFjaCBkYXRlCiAgICAgICAgZm9yIChTdHJpbmcgZGF0ZSA6IHRyYW5zYWN0aW9uc0J5RGF0ZS5rZXlTZXQoKSkgewogICAgICAgICAgICBDb2xsZWN0aW9uPFRyYW5zYWN0aW9uPiBkYXRlVHJhbnNhY3Rpb25zID0gdHJhbnNhY3Rpb25zQnlEYXRlLmdldChkYXRlKTsKICAgICAgICAgICAgZG91YmxlIGF2ZXJhZ2VBbW91bnQgPSBkYXRlVHJhbnNhY3Rpb25zLnN0cmVhbSgpCiAgICAgICAgICAgICAgICAgICAgLm1hcFRvRG91YmxlKHQgLT4gdC5hbW91bnQpCiAgICAgICAgICAgICAgICAgICAgLmF2ZXJhZ2UoKQogICAgICAgICAgICAgICAgICAgIC5vckVsc2UoMC4wKTsKICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGYoIiVzIC0gJS4yZiRcbiIsIGRhdGUsIGF2ZXJhZ2VBbW91bnQpOwogICAgICAgIH0KICAgIH0KCiAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CiAgICAgICAgTGlzdDxUcmFuc2FjdGlvbj4gdHJhbnNhY3Rpb25zID0gQXJyYXlzLmFzTGlzdCgKICAgICAgICAgICAgbmV3IFRyYW5zYWN0aW9uKDUwMCwgIkNyZWRpdCIsICIyMDIzLTA1LTI3IiksCiAgICAgICAgICAgIG5ldyBUcmFuc2FjdGlvbigxNTAwLCAiRGViaXQiLCAiMjAyMy0wNC0wNiIpLAogICAgICAgICAgICBuZXcgVHJhbnNhY3Rpb24oMTgwMCwgIkNyZWRpdCIsICIyMDIzLTA4LTA2IiksCiAgICAgICAgICAgIG5ldyBUcmFuc2FjdGlvbigyNTAsICJDcmVkaXQiLCAiMjAyMy0wNS0yNyIpLAogICAgICAgICAgICBuZXcgVHJhbnNhY3Rpb24oNTAwLCAiRGViaXQiLCAiMjAyMy0wNS0yNyIpCiAgICAgICAgKTsKCiAgICAgICAgcHJvY2Vzc1RyYW5zYWN0aW9ucyh0cmFuc2FjdGlvbnMpOwogICAgfQp9Cg==