/* EmployeeControlBreakReportR.java CIS 111 Dave Klick 2013-11-23 Reads in R/A 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; // CIS111App requires a class to represent a R/A record // This class represents a fixed-length record on disk class Employee implements Comparable { String name = "12345678901234567890"; String dept = "12345"; double rate; // Default constructor for Employee objects // Used for: new Employee() public Employee() { } // Constructor for Employee objects // Used for: new Employee(String, String, double) public Employee(String nm, String dp, double rt) { name = nm; dept = dp; rate = rt; } // Implementation of Comparable interface // This is required for built-in sort in Collections public int compareTo(Employee e) { int n = dept.compareToIgnoreCase(e.dept); if (n == 0) n = name.compareToIgnoreCase(e.name); return n; } } public class EmployeeControlBreakReportR extends CIS111App { public static void main(String[] args) { // An example Employee object is needed for CIS111App R/A Employee rec = new Employee(); // This opens the file for both R/A input and output RandomFile file = new RandomFile("emp.jmg", rec); // Get number of records already in file // Note: record numbering starts at 1 int numrecs = (int) (file.numberOfRecords()); // Create an ArrayList to hold Employee objects ArrayList list = new ArrayList(); // Read records into the ArrayList for (int recnum=1; recnum<=numrecs; recnum++) { list.add((Employee) file.get(recnum)); } file.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", trim$(emp.name), trim$(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); } }