/* EmployeeControlBreakReport.java CIS 111 Dave Klick 2013-11-15 Reads in sequential file data, creates Employee objects, stores them in an ArrayList, and then sorts and displays the data in a control break report. */ import java.util.ArrayList; import java.util.Collections; class Employee implements Comparable { public String name; public String dept; public double rate; public Employee(String nm, String dp, double rt) { name = nm; dept = dp; rate = rt; } public int compareTo(Employee e) { int n = dept.compareToIgnoreCase(e.dept); if (n == 0) n = name.compareToIgnoreCase(e.name); return n; } } public class EmployeeControlBreakReport extends CIS111App { public static void main(String[] args) { SequentialFile infile = new SequentialFile("emp.txt", FileMode.INPUT); ArrayList list = new ArrayList(); // read records into ArrayList while (!infile.eof()) { list.add(new Employee(infile.readString(), infile.readString(), infile.readDouble())); } infile.close(); // sort records Collections.sort(list); // do control break report - average rate per department String prevDept = "!!!!!"; double deptRate = 0.0; int deptCount = 0; double totalRate = 0.0; int totalCount = 0; // display headings println("Name Dept Rate"); println("---------- ------ -------"); for (Employee emp : list) { // control break - show average for department if (!prevDept.equalsIgnoreCase(emp.dept) && totalCount>0) { printf("Department Average: %7.2f\n\n", deptRate / deptCount); totalRate += deptRate; deptCount = 0; deptRate = 0.0; } // display detail for each record printf("%-10s %-6s %7.2f\n", emp.name, emp.dept, emp.rate); // update totals prevDept = emp.dept; deptCount++; deptRate += emp.rate; totalCount++; } // control break - show average for last department printf("Department Average: %7.2f\n\n", deptRate / deptCount); totalRate += deptRate; // show average for all records printf("Company Average: %7.2f\n\n", totalRate / totalCount); } }