Introduction to Programming in Java | Robert Sedgewick, Kevin Wayne