230 likes | 356 Views
CSSE221: Software Dev. Honors Day 12. Announcements No baby yet… Fifteen done. Please read Class Announcements forum. Info about submitting IEPs there. New “late day” policy: You get 2 “late days” over the course of the term that each give you a 24-hour extension
E N D
CSSE221: Software Dev. Honors Day 12 • Announcements • No baby yet… • Fifteen done. • Please read Class Announcements forum. Info about submitting IEPs there. • New “late day” policy: • You get 2 “late days” over the course of the term that each give you a 24-hour extension • The burden of turning in an assignment on a non-class day is on you. • You may earn late days for later use by turning in the assignment a day early. • You may use only 1 late day (or earn 1 early day) per assignment • Some restrictions apply (like right before an exam) • I’ll allow this to be retroactive to any assignment you tried to submit late or thought about doing; just resubmit it on Thursday and I’ll enter the grade.
This week: CarsTrucksTrains • Monday: • Project workday • Tuesday: • Generics (capsule) • Iterators • Thursday: • Lists (capsule) • Implementation of linked lists
Generics • We really want our algorithms to operate on any type of data, without having to re-write the whole method. • In Java, we can do this two ways: • Use inheritance (pre-Java 1.5, a bit clunky) • Use Generics (newer, nicer)
Using Inheritance ArrayList list = new ArrayList(); list.add(new Integer(3)); // 3 needs to be boxed list.add("hello"); int num = list.get(0); // doesn’t work Integer temp = (Integer)list.get(0); int num = temp.intValue(); // unboxing ArrayList list = new ArrayList(); list.add(3); list.add("hello"); int num = list.get(0); // doesn’t work int num = (Integer)list.get(0); Problems/concerns? • We don’t have control over what goes into the list • Typecasting is a pain (and since we don’t have control, then we have to check for compatibility using instanceof to avoid ClassCastExceptions • Note: in Java 1.4, it was even worse…
Using Generics ArrayList<Integer> list = new ArrayList<Integer>(); list.add(3); list.add(“hello”); // invalid int num = list.get(0); // works! Solves both those problems! • We have control over the types of what goes into the list • No typecasting needed
Creating code with Generics • To use generics, use the type in a parameter. • Example showing: • The use of a type in a class • Various places where the type parameter can be used: public class SomeClass<E> { public E someMethod(E param) { E retValue = 2 * param; return retValue; } … } • Unfortunately, this example doesn’t work, since we can’t multiply 2 by an unknown, possibly non-numeric type.
Going further • What if I have a method that operates on an ArrayList of Vehicles, but I want to pass an ArrayList of Trucks? • Intuitively, this should work, but Java doesn’t allow it, since it couldn’t catch errors until runtime. • Solution? In the method declaration, use type boundswith wildcards: • public void processVehicle(ArrayList<? extends Vehicle> list) { • for (Vehicle v : list) { … } }
Yet further and messier-looking • Consider static E findMedian(E[] array) • Takes an array of type E, returns a value of that type • But we need to restrict the generics to Comparable types only (because we need compareTo). Use type bounds: static <E extends Comparable> E findMedian(E[] array) • But Comparable is generic: static <E extends Comparable<E>> E findMedian(E[] array) • To enforce that E is Comparable, use static <E extends Comparable<? super E>> E findMedian(E[] array) If Vehicles were Comparable, then E could be Truck. Then ? would be Vehicle
Type erasure • At compile time, the generics are replaced with the types used • If there are bounds, it uses them and inserts the proper casts
Some Limitations • Can’t use primitives as types • No int, need to use Integer • Can’t instantiate a type: E foo = new E(); • What is E? It could even be an abstract class; this wouldn’t make sense! • Can’t make generic arrays: E[] ar = new E[17]; • Naïve solution: use typecasts: • E[] ar = (E[])(new Object[17]) • This gives a compiler warning • Better solution: use ArrayList<E>
Break • Pass in quizzes (questions 1 and 2); I’ll use a different quiz for the second half.
Data Structures and the Java Collections Framework • What is data? • What do we mean by "structure" • A data type • But what is a data type, really? • An interpretation of the bits • An interpretation is basically a set of operations. • The interpretation may be provided by the hardware, as for int and double types, or by software, as for the java.math.BigInteger type. • Or by software with much assistance from the hardware, as for the java.lang.Array type.
Some basic data structures • Array (1D, 2D, …) • Stack • Queue • List • ArrayList • LinkedList • Set • MultiSet • Map (a.k.a. table, dictionary) • HashMap • TreeMap • PriorityQueue • Tree • Graph • Network What is "special" about each data type? What is each used for? What can you say about time required foradding an element?removing an element?Finding an element? You should know these, inside and out, by the end of CSSE230.
Specifying an ADT in Java • The main Java tool for specifying an ADT is … • … an interface: • Some important methods from this interface: Factory method
Iterators • Consider a loop to fund the sum of each element in an array: for (int i = 0; i < ar.length; i++) { sum += ar[i]; } We want to generalize this beyond arrays
What's an iterator? • More specifically, what is a java.util.Iterator? • It's an interface: • interface java.util.Iterator<E> • with the following methods: • We create a new concrete instance of an iterator, but use an interface return type (using polymorphism). This is what a factory method does. • The advantage is that if we change the type of collection used in main(), then we don’t have to change the iterator type.
Example: Using an Iterator ag is a Collection object. Using Java 1.5’s “foreach” construct: Note that the Java compiler essentially translates the latter code into the former.
What's an iterator? • More specifically, what is a java.util.Iterator? • It's an interface: • interface java.util.Iterator<E> • with the following methods: • Why do iterators have their own remove method, separate from the Collections’ remove?
Sort and Binary Search • The java.util.Arrays class provides static methods for sorting and doing binary search on arrays. Examples:
Sort and Binary Search • Thejava.util.Collections class provides similar static methods for sorting and doing binary search on Collections. Specifically Lists. • Look up the details in the documentation.