The problem
The file SalesData.txt contains the dollar amount of sales that a retail store made each day for a number of weeks. Each line in the file contains seven numbers, which are the sales numbers for one week. The numbers are separeted by a comma.
Write a program that opens the file and processes its comments. The program should display the following:
- The total sales for each week
- The average daily sales for each week
- The total sales for all of the weeks
- The average weekly sales
- The week number that had the highest amount of sales
- The week number that had the lowest amount of sales
Setup
The following is the entire SalesData.txt file from the file.
1245.67,1490.07,1679.87,2371.46,1783.92,1461.99,2059.77
2541.36,2965.88,1965.32,1845.23,7021.11,9652.74,1469.36
2513.45,1963.22,1568.35,1966.35,1893.25,1025.36,1128.36
Breaking it down
The exercise has requirements to display statistics at the weekly level and at the file or total sales level. This exercise could get complicated fast for instance, you could create object to represent the weekly and daily sales or the code could get fairly ugly. We tried to find the balance of each and know that you could reduce the number of lines of code.
In the main method we read the text file and break up each line by a comma creating a List of DoubleSummaryStatistics objects which represents the weekly stats. DoubleSummaryStatistics is an object for collecting statistics such as count, min, max, sum, and average provided in java 8. To get the overall stats, we will call various methods on DoubleSummaryStatistics method and summarize the values.
public static void main(String[] args) throws IOException {
Path salesDataPath = Paths
.get("src/main/resources/com/levelup/java/exercises/beginner/SalesData.txt")
.toAbsolutePath();
//read all lines into a list of strings
List<String> fileByLines = java.nio.file.Files
.readAllLines(salesDataPath);
//convert each string into a DoubleSummaryStatistics object
List<DoubleSummaryStatistics> weeksSummary = new ArrayList<>();
for (String row : fileByLines) {
// split on comma, map to double
weeksSummary.add(Arrays.stream(row.split(","))
.mapToDouble(Double::valueOf).summaryStatistics());
}
displayWeeklyStats(weeksSummary);
displaySummaryResults(weeksSummary);
}
public static void displayWeeklyStats(
List<DoubleSummaryStatistics> weeksSummary) {
// for every week output the stats
for (int x = 0; x < weeksSummary.size(); x++) {
DoubleSummaryStatistics weekStat = weeksSummary.get(x);
System.out.println("Week #" + x + " sales: $" + weekStat.getSum());
System.out.println("Average daily sales for week #" + x + ": $"
+ weekStat.getAverage());
}
}
public static void displaySummaryResults(
List<DoubleSummaryStatistics> weeksSummary) {
System.out.println("Total sales for all weeks: $"
+ weeksSummary.stream().mapToDouble(p -> p.getSum()).sum());
System.out.println("Average weekly sales: $"
+ weeksSummary.stream().mapToDouble(p -> p.getSum()).average()
.getAsDouble());
System.out.println("The highest sales was $"
+ weeksSummary.stream().mapToDouble(p -> p.getSum()).max()
.getAsDouble());
System.out.println("The lowest sales were made during "
+ weeksSummary.stream().mapToDouble(p -> p.getSum()).min()
.getAsDouble());
}
Output
Week #0 sales: $12092.75
Average daily sales for week #0: $1727.5357142857142
Week #1 sales: $27461.0
Average daily sales for week #1: $3923.0
Week #2 sales: $12058.34
Average daily sales for week #2: $1722.6200000000001
Total sales for all weeks: $51612.09
Average weekly sales: $17204.03
The highest sales was $27461.0
The lowest sales were made during 12058.34