-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathExpenseTracker.java
More file actions
161 lines (140 loc) · 5.85 KB
/
ExpenseTracker.java
File metadata and controls
161 lines (140 loc) · 5.85 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
import java.io.*;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.*;
public class ExpenseTracker {
private static final String FILE_NAME = "expenses.txt";
private static List<Expense> expenses = new ArrayList<>();
private static int expenseIdCounter = 1;
public static void main(String[] args) {
loadExpensesFromFile();
Scanner scanner = new Scanner(System.in);
int choice;
do {
System.out.println("\n--- Personal Expense Tracker ---");
System.out.println("1. Add Expense");
System.out.println("2. View All Expenses");
System.out.println("3. Delete Expense");
System.out.println("4. Search Expense by ID");
System.out.println("5. Calculate Total Expenses");
System.out.println("6. Show Month-Wise Expenses");
System.out.println("7. Save and Exit");
System.out.print("Enter your choice: ");
choice = scanner.nextInt();
scanner.nextLine(); // Consume newline
switch (choice) {
case 1 -> addExpense(scanner);
case 2 -> viewAllExpenses();
case 3 -> deleteExpense(scanner);
case 4 -> searchExpenseById(scanner);
case 5 -> calculateTotalExpenses();
case 6 -> showMonthWiseExpenses();
case 7 -> {
saveExpensesToFile();
System.out.println("Exiting... Thank you!");
}
default -> System.out.println("Invalid choice. Please try again.");
}
} while (choice != 7);
}
private static void addExpense(Scanner scanner) {
System.out.print("Enter date (YYYY-MM-DD): ");
String date = scanner.nextLine();
System.out.print("Enter category: ");
String category = scanner.nextLine();
System.out.print("Enter amount: ");
double amount = scanner.nextDouble();
scanner.nextLine(); // Consume newline
System.out.print("Enter description: ");
String description = scanner.nextLine();
Expense expense = new Expense(expenseIdCounter++, date, category, amount, description);
expenses.add(expense);
System.out.println("Expense added successfully!");
}
private static void viewAllExpenses() {
System.out.println("\n--- All Expenses ---");
if (expenses.isEmpty()) {
System.out.println("No expenses recorded.");
return;
}
for (Expense expense : expenses) {
System.out.println(expense);
}
}
private static void deleteExpense(Scanner scanner) {
System.out.print("Enter the ID of the expense to delete: ");
int id = scanner.nextInt();
scanner.nextLine(); // Consume newline
boolean removed = expenses.removeIf(expense -> expense.getId() == id);
if (removed) {
System.out.println("Expense deleted successfully!");
} else {
System.out.println("Expense not found.");
}
}
private static void searchExpenseById(Scanner scanner) {
System.out.print("Enter the ID of the expense to search: ");
int id = scanner.nextInt();
scanner.nextLine(); // Consume newline
for (Expense expense : expenses) {
if (expense.getId() == id) {
System.out.println("Expense Found: " + expense);
return;
}
}
System.out.println("Expense with ID " + id + " not found.");
}
private static void calculateTotalExpenses() {
double total = 0;
for (Expense expense : expenses) {
total += expense.getAmount();
}
System.out.println("Total Expenses: " + total);
}
private static void showMonthWiseExpenses() {
if (expenses.isEmpty()) {
System.out.println("No expenses recorded.");
return;
}
Map<String, Double> monthWiseExpenses = new TreeMap<>();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM");
for (Expense expense : expenses) {
LocalDate date = LocalDate.parse(expense.getDate());
String month = date.format(formatter);
monthWiseExpenses.put(month, monthWiseExpenses.getOrDefault(month, 0.0) + expense.getAmount());
}
System.out.println("\n--- Month-Wise Expenses ---");
for (Map.Entry<String, Double> entry : monthWiseExpenses.entrySet()) {
System.out.printf("Month: %s | Total Expense: %.2f\n", entry.getKey(), entry.getValue());
}
}
private static void saveExpensesToFile() {
try (BufferedWriter writer = new BufferedWriter(new FileWriter(FILE_NAME))) {
for (Expense expense : expenses) {
writer.write(expense.toFileString());
writer.newLine();
}
System.out.println("Expenses saved successfully.");
} catch (IOException e) {
System.out.println("Error saving expenses: " + e.getMessage());
}
}
private static void loadExpensesFromFile() {
File file = new File(FILE_NAME);
if (!file.exists()) {
System.out.println("No previous data found. Starting fresh.");
return;
}
try (BufferedReader reader = new BufferedReader(new FileReader(file))) {
String line;
while ((line = reader.readLine()) != null) {
Expense expense = Expense.fromFileString(line);
expenses.add(expense);
expenseIdCounter = Math.max(expenseIdCounter, expense.getId() + 1);
}
System.out.println("Expenses loaded successfully.");
} catch (IOException e) {
System.out.println("Error loading expenses: " + e.getMessage());
}
}
}