import com.google.common.collect.*;
import java.util.*;
import java.time.*;
class Transaction {
double amount;
LocalDate date;
Transaction
(double amount,
String transactionType,
String date
) { this.amount = amount;
this.transactionType = transactionType;
this.date = LocalDate.parse(date);
}
public double getAmount() {
return amount;
}
public String getTransactionType
() { return transactionType;
}
public LocalDate getDate() {
return date;
}
}
public class Main {
public static void processTransactions(List<Transaction> transactions) {
// Filter by "Credit" and group by date
ImmutableListMultimap<LocalDate, Transaction> transactionsByDate = Multimaps.index(
FluentIterable.from(transactions)
.filter(t -> "Credit".equals(t.getTransactionType())),
Transaction::getDate);
// Calculate and print average amount for each date
for (LocalDate date : transactionsByDate.keySet()) {
Collection<Transaction> dateTransactions = transactionsByDate.get(date);
double average = dateTransactions.stream()
.mapToDouble(Transaction::getAmount)
.average()
.orElse(0.0);
System.
out.
println(date
+ " - " + String.
format("%.2f$", average
)); }
}
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);
}
}
aW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuKjsKaW1wb3J0IGphdmEudXRpbC4qOwppbXBvcnQgamF2YS50aW1lLio7CgpjbGFzcyBUcmFuc2FjdGlvbiB7CiAgICBkb3VibGUgYW1vdW50OwogICAgU3RyaW5nIHRyYW5zYWN0aW9uVHlwZTsKICAgIExvY2FsRGF0ZSBkYXRlOwoKICAgIFRyYW5zYWN0aW9uKGRvdWJsZSBhbW91bnQsIFN0cmluZyB0cmFuc2FjdGlvblR5cGUsIFN0cmluZyBkYXRlKSB7CiAgICAgICAgdGhpcy5hbW91bnQgPSBhbW91bnQ7CiAgICAgICAgdGhpcy50cmFuc2FjdGlvblR5cGUgPSB0cmFuc2FjdGlvblR5cGU7CiAgICAgICAgdGhpcy5kYXRlID0gTG9jYWxEYXRlLnBhcnNlKGRhdGUpOwogICAgfQoKICAgIHB1YmxpYyBkb3VibGUgZ2V0QW1vdW50KCkgewogICAgICAgIHJldHVybiBhbW91bnQ7CiAgICB9CgogICAgcHVibGljIFN0cmluZyBnZXRUcmFuc2FjdGlvblR5cGUoKSB7CiAgICAgICAgcmV0dXJuIHRyYW5zYWN0aW9uVHlwZTsKICAgIH0KCiAgICBwdWJsaWMgTG9jYWxEYXRlIGdldERhdGUoKSB7CiAgICAgICAgcmV0dXJuIGRhdGU7CiAgICB9Cn0KCnB1YmxpYyBjbGFzcyBNYWluIHsKICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBwcm9jZXNzVHJhbnNhY3Rpb25zKExpc3Q8VHJhbnNhY3Rpb24+IHRyYW5zYWN0aW9ucykgewogICAgICAgIC8vIEZpbHRlciBieSAiQ3JlZGl0IiBhbmQgZ3JvdXAgYnkgZGF0ZQogICAgICAgIEltbXV0YWJsZUxpc3RNdWx0aW1hcDxMb2NhbERhdGUsIFRyYW5zYWN0aW9uPiB0cmFuc2FjdGlvbnNCeURhdGUgPSBNdWx0aW1hcHMuaW5kZXgoCiAgICAgICAgICAgICAgICBGbHVlbnRJdGVyYWJsZS5mcm9tKHRyYW5zYWN0aW9ucykKICAgICAgICAgICAgICAgICAgICAgICAgLmZpbHRlcih0IC0+ICJDcmVkaXQiLmVxdWFscyh0LmdldFRyYW5zYWN0aW9uVHlwZSgpKSksCiAgICAgICAgICAgICAgICBUcmFuc2FjdGlvbjo6Z2V0RGF0ZSk7CgogICAgICAgIC8vIENhbGN1bGF0ZSBhbmQgcHJpbnQgYXZlcmFnZSBhbW91bnQgZm9yIGVhY2ggZGF0ZQogICAgICAgIGZvciAoTG9jYWxEYXRlIGRhdGUgOiB0cmFuc2FjdGlvbnNCeURhdGUua2V5U2V0KCkpIHsKICAgICAgICAgICAgQ29sbGVjdGlvbjxUcmFuc2FjdGlvbj4gZGF0ZVRyYW5zYWN0aW9ucyA9IHRyYW5zYWN0aW9uc0J5RGF0ZS5nZXQoZGF0ZSk7CiAgICAgICAgICAgIGRvdWJsZSBhdmVyYWdlID0gZGF0ZVRyYW5zYWN0aW9ucy5zdHJlYW0oKQogICAgICAgICAgICAgICAgICAgIC5tYXBUb0RvdWJsZShUcmFuc2FjdGlvbjo6Z2V0QW1vdW50KQogICAgICAgICAgICAgICAgICAgIC5hdmVyYWdlKCkKICAgICAgICAgICAgICAgICAgICAub3JFbHNlKDAuMCk7CiAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihkYXRlICsgIiAtICIgKyBTdHJpbmcuZm9ybWF0KCIlLjJmJCIsIGF2ZXJhZ2UpKTsKICAgICAgICB9CiAgICB9CgogICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewogICAgICAgIExpc3Q8VHJhbnNhY3Rpb24+IHRyYW5zYWN0aW9ucyA9IEFycmF5cy5hc0xpc3QoCiAgICAgICAgICAgICAgICBuZXcgVHJhbnNhY3Rpb24oNTAwLCAiQ3JlZGl0IiwgIjIwMjMtMDUtMjciKSwKICAgICAgICAgICAgICAgIG5ldyBUcmFuc2FjdGlvbigxNTAwLCAiRGViaXQiLCAiMjAyMy0wNC0wNiIpLAogICAgICAgICAgICAgICAgbmV3IFRyYW5zYWN0aW9uKDE4MDAsICJDcmVkaXQiLCAiMjAyMy0wOC0wNiIpLAogICAgICAgICAgICAgICAgbmV3IFRyYW5zYWN0aW9uKDI1MCwgIkNyZWRpdCIsICIyMDIzLTA1LTI3IiksCiAgICAgICAgICAgICAgICBuZXcgVHJhbnNhY3Rpb24oNTAwLCAiRGViaXQiLCAiMjAyMy0wNS0yNyIpCiAgICAgICAgKTsKCiAgICAgICAgcHJvY2Vzc1RyYW5zYWN0aW9ucyh0cmFuc2FjdGlvbnMpOwogICAgfQp9Cg==