Posted:  Oct 24, 2015

***Due:  Nov 8, 2015 @ 11:59PM***

##Goal:
To explore an advanced application of priority queues in order to gain a deeper understanding of the data structure.

##High-level description:
You will be writing a basic application to help a user select a car to buy.
You will write a menu-based user interface driver program (to be run in the terminal, no GUI), but most of the logic will be in implementing an indexable double priority queue.
You should write a double PQ data structure that stores objects according to their relative priorities of two of their attributes, specifically making it efficient to retrieve objects with the minimum value of either attribute.
The double PQ class is further indexable to allow updates of entered items.
You will want users to be able to enter details about cars that they are considering buying.
The user should then be able to efficiently retrieve the car with the lowest mileage or lowest price.
These retrievals should be possible on the set of all entered cars or on the set of all cars of a specific make and model (e.g., "lowest price Ford Fiesta", "lowest mileage Cadillac Escalade").

##Specifications:
1.  First you must create a class to store data about cars to buy
	Specifically, this class must contain the following information:
	*  A unique VIN number (17 character string of numbers and capital letters (but no I (i), O (o), or Q (q) to avoid confusion with numerals 1 and 0)
	*  The car's make (e.g., Ford, Toyota, Honda)
	*  The car's model (e.g., Fiesta, Camry, Civic)
	*  The price to purchase (in dollars)
	*  The mileage of the car
	*  The color of the car
1.  You must write a terminal menu-based driver program (again, no GUI).
	Specifically, your driver must present the user with the following options:
	1.  Add a car
		*  This will (one at a time) prompt the user for all of the above-listed attributes of a car to keep track of
	1.  Update a car
		*  This option will prompt the user for the VIN number of a car to update, and then ask the user if they would like to update 1) the price of the car, 2) the mileage of the car, or 3) the color of the car
	1.  Remove a specific car from consideration
		*  This option will prompt the user for the VIN number of a car to remove from the data structure (e.g., if it is no longer for sale)
		*  Note that this mean you will need to support removal of cars other than the minimum (price or mileage) car
	1.  Retrieve the lowest price car
	1.  Retrieve the lowest mileage car
	1.  Retrieve the lowest price car by make and model
		* This option will prompt the user to enter (one at a time) a make and model and then return the car with the minimum price for that make and model
	1.  Retrieve the lowest mileage car by make and model
		* This option will prompt the user to enter (one at a time) a make and model and then return the car with the minimum mileage for that make and model
1.  Retrieval operations should not remove the car with minimum price or mileage from the datastructure, just return information about that car.
	Cars should only be removed via the "remove a specific car from consideration" menu option.
1.  To ensure efficiency of operations, you must base your PQ class around the use of heaps with indirection data structures (which make them indexable).
	Note that operations on either attribute (e.g., retrieve minimum price, retrieve minimum mileage) should be efficient.
	Take care in selecting your approach to the indirection data structure to account for they types of keys you will need to store and the type and number operations that you will need to perform on it.
1.  Because this project requires you to make a number of decisions about how to implement its requirements, you will need to write a documentation file explaining your implementation, and justifying your decisions.
	Name this file "documentation.txt".
	Be sure to describe your carefully document your approach to ease the effort required to trace through your code for grading.
	Be sure to include descriptions of the runtime and space requirements of your approach and use them in your justification of why you think your approach is the best way to go.

##Submission Guidelines:
*  **DO NOT SUBMIT** any IDE package files.
*  You must name the primary driver for your program CarTracker.java.
*  You must be able to compile your game by running "javac CarTracker.java".
*  You must be able to run your program with "java CarTracker".
*  You must document and justify your approach in "documentation.txt".
*  You must fill out info_sheet.txt.
*  Be sure to remember to push the latest copy of your code back to your GitHub repository before the the assignment is due.  At 12:00 AM Nov 9, the repositories will automatically be copied for grading.  Whatever is present in your GitHub repository at that time will be considered your submission for this assignment.

##Additional Notes/Hints:
*  You are free to use code provided by the book authors in implementing your solution.
	It is up to you to decide if it would be easier to modify the provided code to meet the requirements of this project or if it would be easier to start with a clean slate with all of your own code.
