import com.google.common.collect.ArrayListMultimap;
import com.google.common.collect.Multimap;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
public class Main {
static class Transaction {
int amount;
LocalDate date;
Transaction
(int amount,
String transactionType,
String dateString
) { this.amount = amount;
this.transactionType = transactionType;
this.date = LocalDate.parse(dateString, DateTimeFormatter.ISO_LOCAL_DATE);
}
public int getAmount() {
return amount;
}
public String getTransactionType
() { return transactionType;
}
public LocalDate getDate() {
return date;
}
}
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-08"),
new Transaction(500, "Debit", "2023-05-05")
);
processTransactions(transactions);
}
private static void processTransactions(List<Transaction> transactions) {
Multimap
<String, Transaction
> transactionsByMonth
= ArrayListMultimap.
create();
transactions.stream()
.filter(t -> "Credit".equals(t.getTransactionType()))
.forEach(t -> transactionsByMonth.put(t.getDate().getMonth().toString(), t));
for (String month
: transactionsByMonth.
keySet()) { double average = transactionsByMonth.get(month).stream()
.mapToInt(Transaction::getAmount)
.average()
.orElse(0);
System.
out.
println("\"" + month
+ "\", " + (int) average
); }
}
}
aW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuQXJyYXlMaXN0TXVsdGltYXA7CmltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lk11bHRpbWFwOwppbXBvcnQgamF2YS50aW1lLkxvY2FsRGF0ZTsKaW1wb3J0IGphdmEudGltZS5mb3JtYXQuRGF0ZVRpbWVGb3JtYXR0ZXI7CmltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwppbXBvcnQgamF2YS51dGlsLkxpc3Q7CmltcG9ydCBqYXZhLnV0aWwuTWFwOwoKcHVibGljIGNsYXNzIE1haW4gewoKICAgIHN0YXRpYyBjbGFzcyBUcmFuc2FjdGlvbiB7CiAgICAgICAgaW50IGFtb3VudDsKICAgICAgICBTdHJpbmcgdHJhbnNhY3Rpb25UeXBlOwogICAgICAgIExvY2FsRGF0ZSBkYXRlOwoKICAgICAgICBUcmFuc2FjdGlvbihpbnQgYW1vdW50LCBTdHJpbmcgdHJhbnNhY3Rpb25UeXBlLCBTdHJpbmcgZGF0ZVN0cmluZykgewogICAgICAgICAgICB0aGlzLmFtb3VudCA9IGFtb3VudDsKICAgICAgICAgICAgdGhpcy50cmFuc2FjdGlvblR5cGUgPSB0cmFuc2FjdGlvblR5cGU7CiAgICAgICAgICAgIHRoaXMuZGF0ZSA9IExvY2FsRGF0ZS5wYXJzZShkYXRlU3RyaW5nLCBEYXRlVGltZUZvcm1hdHRlci5JU09fTE9DQUxfREFURSk7CiAgICAgICAgfQoKICAgICAgICBwdWJsaWMgaW50IGdldEFtb3VudCgpIHsKICAgICAgICAgICAgcmV0dXJuIGFtb3VudDsKICAgICAgICB9CgogICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0VHJhbnNhY3Rpb25UeXBlKCkgewogICAgICAgICAgICByZXR1cm4gdHJhbnNhY3Rpb25UeXBlOwogICAgICAgIH0KCiAgICAgICAgcHVibGljIExvY2FsRGF0ZSBnZXREYXRlKCkgewogICAgICAgICAgICByZXR1cm4gZGF0ZTsKICAgICAgICB9CiAgICB9CgogICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewogICAgICAgIExpc3Q8VHJhbnNhY3Rpb24+IHRyYW5zYWN0aW9ucyA9IEFycmF5cy5hc0xpc3QoCiAgICAgICAgICAgICAgICBuZXcgVHJhbnNhY3Rpb24oNTAwLCAiQ3JlZGl0IiwgIjIwMjMtMDUtMjciKSwKICAgICAgICAgICAgICAgIG5ldyBUcmFuc2FjdGlvbigxNTAwLCAiRGViaXQiLCAiMjAyMy0wNC0wNiIpLAogICAgICAgICAgICAgICAgbmV3IFRyYW5zYWN0aW9uKDE4MDAsICJDcmVkaXQiLCAiMjAyMy0wOC0wNiIpLAogICAgICAgICAgICAgICAgbmV3IFRyYW5zYWN0aW9uKDI1MCwgIkNyZWRpdCIsICIyMDIzLTA1LTA4IiksCiAgICAgICAgICAgICAgICBuZXcgVHJhbnNhY3Rpb24oNTAwLCAiRGViaXQiLCAiMjAyMy0wNS0wNSIpCiAgICAgICAgKTsKCiAgICAgICAgcHJvY2Vzc1RyYW5zYWN0aW9ucyh0cmFuc2FjdGlvbnMpOwogICAgfQoKICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcHJvY2Vzc1RyYW5zYWN0aW9ucyhMaXN0PFRyYW5zYWN0aW9uPiB0cmFuc2FjdGlvbnMpIHsKICAgICAgICBNdWx0aW1hcDxTdHJpbmcsIFRyYW5zYWN0aW9uPiB0cmFuc2FjdGlvbnNCeU1vbnRoID0gQXJyYXlMaXN0TXVsdGltYXAuY3JlYXRlKCk7CgogICAgICAgIHRyYW5zYWN0aW9ucy5zdHJlYW0oKQogICAgICAgICAgICAgICAgLmZpbHRlcih0IC0+ICJDcmVkaXQiLmVxdWFscyh0LmdldFRyYW5zYWN0aW9uVHlwZSgpKSkKICAgICAgICAgICAgICAgIC5mb3JFYWNoKHQgLT4gdHJhbnNhY3Rpb25zQnlNb250aC5wdXQodC5nZXREYXRlKCkuZ2V0TW9udGgoKS50b1N0cmluZygpLCB0KSk7CgogICAgICAgIGZvciAoU3RyaW5nIG1vbnRoIDogdHJhbnNhY3Rpb25zQnlNb250aC5rZXlTZXQoKSkgewogICAgICAgICAgICBkb3VibGUgYXZlcmFnZSA9IHRyYW5zYWN0aW9uc0J5TW9udGguZ2V0KG1vbnRoKS5zdHJlYW0oKQogICAgICAgICAgICAgICAgICAgIC5tYXBUb0ludChUcmFuc2FjdGlvbjo6Z2V0QW1vdW50KQogICAgICAgICAgICAgICAgICAgIC5hdmVyYWdlKCkKICAgICAgICAgICAgICAgICAgICAub3JFbHNlKDApOwoKICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJcIiIgKyBtb250aCArICJcIiwgIiArIChpbnQpIGF2ZXJhZ2UpOwogICAgICAgIH0KICAgIH0KfQo=