Computer Science 210
Data Structures
Fall 2017, Siena College
PurchaseTrackerAll BlueJ Project
Click here to download a BlueJ project for PurchaseTrackerAll.
PurchaseTrackerAll Source Code
The Java source code for PurchaseTrackerAll is below. Click on a file name to download it.
/* * Example PurchaseTrackerAll: test out a class that stores items * purchased and their quantities, this time remembering all * of the items we read in and determining the "winners" at the end. * * Jim Teresco, The College of Saint Rose, CSC 523, Summer 2014 * * $Id$ */ import java.util.ArrayList; import java.util.Scanner; public class PurchaseTrackerAll { // A private method to prompt for and read in a valid item // from the given Scanner, returning a PurchasedItem object, // returns null if no item is entered. // The existence of this method avoids some repeated code in // main and also would be able to be used for any Scanner, // not just ones based on the standard input, and would be // a convenient place to add error checking on the input // values (for example, ensure positive values for price // and quantity or the addition of some exception handling // to recover from invalid inputs). private static PurchasedItem readPurchasedItem(Scanner s) { System.out.println("Enter the item name, unit price, and quantity purchased, \"done\" to stop:"); String itemName = s.next(); // if someone typed "done", we return null and don't try to read the other fields if (itemName.equals("done")) return null; double unitPrice = s.nextDouble(); int quantity = s.nextInt(); return new PurchasedItem(itemName, unitPrice, quantity); } public static void main(String[] args) { // create a keyboard Scanner to read lines that describe the items Scanner keyboard = new Scanner(System.in); // create an ArrayList of PurchasedItem objects to store all of them ArrayList<PurchasedItem> items = new ArrayList<PurchasedItem>(); PurchasedItem item; // now read them all in do { item = readPurchasedItem(keyboard); if (item != null) { items.add(item); } } while (item != null); // if there was no valid item entered, we just quit if (items.isEmpty()) { System.out.println("No valid item purchases entered, exiting..."); System.exit(0); } // so we know we have one valid item in the ArrayList, so we // initialize the "leader" in each category to be the first item (position 0) item = items.get(0); PurchasedItem leastExpensiveItem = item; PurchasedItem mostExpensiveItem = item; PurchasedItem largestQuantity = item; PurchasedItem highestTotalCost = item; System.out.println("All items:"); System.out.println(item); // now we can loop over the remaining, printing each and deciding // which are the "winners" for (int itemNum = 1; itemNum < items.size(); itemNum++) { item = items.get(itemNum); System.out.println(item); // do we have any new leaders? if (item.getUnitPrice() < leastExpensiveItem.getUnitPrice()) { leastExpensiveItem = item; } if (item.getUnitPrice() > mostExpensiveItem.getUnitPrice()) { mostExpensiveItem = item; } if (item.getQuantity() > largestQuantity.getQuantity()) { largestQuantity = item; } if (item.getTotalCost() > highestTotalCost.getTotalCost()) { highestTotalCost = item; } } // now report our winners: System.out.println("Least expensive item: " + leastExpensiveItem); System.out.println("Most expensive item: " + mostExpensiveItem); System.out.println("Largest quantity item: " + largestQuantity); System.out.println("Highest total cost item: " + highestTotalCost); } }
/** * A custom class to represent a purchased item based on name, * unit price, and a quantity purchased. * * @author Jim Teresco * * $Id$ */ import java.text.DecimalFormat; public class PurchasedItem { // we need instance variables to remember the // name, unit price, and quantity private String name; private double unitPrice; private int quantity; // we can create a static class variable that refers to // a single DecimalFormat object that can be shared among // all instances of this class private static DecimalFormat currency = new DecimalFormat("$0.00"); // our constructor needs the initial values for the three // fields in our object public PurchasedItem(String name, double unitPrice, int quantity) { this.name = name; this.unitPrice = unitPrice; this.quantity = quantity; } // we'll need a toString method public String toString() { return name + ": " + quantity + " @ " + currency.format(unitPrice) + " = " + currency.format(unitPrice * quantity); } // a variety of accessors are needed here, and here they are public double getUnitPrice() { return unitPrice; } public int getQuantity() { return quantity; } public double getTotalCost() { return unitPrice * quantity; } }