OOP with Java, David J. Barnes Collection Classes1 The Need for Flexible Size Collections. The...

Post on 31-Dec-2015

218 views 0 download

Tags:

Transcript of OOP with Java, David J. Barnes Collection Classes1 The Need for Flexible Size Collections. The...

OOP with Java, David J. Barnes

Collection Classes 1

Collection Classes

• The Need for Flexible Size Collections.

• The ArrayList Class.

• Collections and Object Identity.

• The LinkedList Class.

• Wrapper Classes.

• Iterating through a Collection.

OOP with Java, David J. Barnes

Collection Classes 2

Flexible Size Collections

• In some applications, the required size for a collection may be unpredictable or variable.– Cards in a hand (bounded but variable).– Callers to a radio phone-in (unbounded).– Passengers on a ferry (unbounded?).

• Arrays are not always suitable for holding such data.

OOP with Java, David J. Barnes

Collection Classes 3

Array Unsuitability

• A smaller array might arbitrarily limit the capacity.

• A very large array will waste capacity.– There might be no guarantees that it will not

overflow, anyway.

• We could create a new array if the old one fills up.– Problem with notifying aliases.

OOP with Java, David J. Barnes

Collection Classes 4

Custom Collection Classes

• Two main classes, defined in java.util.– ArrayList and LinkedList.

• No fixed size.

• Expand and contract as required.

• No wasted space, no arbitrary limit.

• Can only hold objects, not primitive values.– Wrapper classes solve this problem.

OOP with Java, David J. Barnes

Collection Classes 5

An ArrayList for Strings

import java.util.*;

class RadioShow { ... // Store the names of callers. private ArrayList callers = new ArrayList();}

• Compare with an equivalent array declaration:• private String[] callers = new String[max];

OOP with Java, David J. Barnes

Collection Classes 6

ArrayList Methods

• Items in a collection `lose' their identity.

• Each item has an index (0...size()-1).– ArrayList defines add, get, set, remove and clear methods, for instance.

• Existing items are automatically moved.– An item's index might change.

• The capacity grows automatically.– The trimToSize method minimizes it.

OOP with Java, David J. Barnes

Collection Classes 7

Collections and Object Identity

• Objects have both a dynamic type and a static type.– An object's dynamic type is fixed.– An object's static type depends on the variable

used to refer to it.

• Collections treat everything as Object.– They are generally passive, not needing to

interact with the items they contain.

OOP with Java, David J. Barnes

Collection Classes 8

Object Casts

• Retrieving an object usually requires a cast:

// ArrayList callers = getCallers();// Get the first caller (compilation error).String caller = callers.get(0);

• The compiler cannot tell that the object is a String, so an explicit cast is needed:

String caller = (String) callers.get(0);

OOP with Java, David J. Barnes

Collection Classes 9

The LinkedList Class• Very similar interface to ArrayList.

– add, clear, get, indexOf, remove, set.

• Additional direct access to first and last items in the list.– getFirst, getLast, removeFirst, addLast, etc.

• Suitable for data structures, e.g., stacks and queues.

OOP with Java, David J. Barnes

Collection Classes 10

The Wrapper Classes

• Collection classes cannot hold primitive-type values.

• These must be wrapped in an object.

• Each type has a wrapper class.– Boolean, Character, Double, Integer, etc.

– Methods: intValue, doubleValue, etc.– String parsing methods.

OOP with Java, David J. Barnes

Collection Classes 11

Wrapping Integers

ArrayList list = new ArrayList();int num = keyboard.nextInt();while(num >= 0){ Integer wrapper = new Integer(num); list.add(wrapper); num = keyboard.nextInt();}// Sort the values.Collections.sort(list);

OOP with Java, David J. Barnes

Collection Classes 12

Iterating through a Collection

• We could use integer indices:

final int numItems = nameList.size();for(int i = 0; i < numItems; i++){ System.out.println((String) nameList.get(i));}

• This would be inefficient for a LinkedList, because it does not store its items in an array.

OOP with Java, David J. Barnes

Collection Classes 13

Iterator

• Provides efficient iteration over an arbitrary collection.

Iterator names = nameList.iterator();while(names.hasNext()){ String who = (String) names.next(); if(who.startWith("X")){ names.remove(); }}

OOP with Java, David J. Barnes

Collection Classes 14

Queue and Stack Collections

• An ArrayList permits efficient retrieval of data from random positions.

• Access is often more orderly.– First-In, First-Out (FIFO) Queue.– Last-In, First-Out (LIFO) Stack.

• A LinkedList is well suited to supporting such specialized collections.

OOP with Java, David J. Barnes

Collection Classes 15

Queues

• Common in every-day life– Bus queues, traffic jams, cafeteria.

• Enter at the tail– Use the list's add method.

• Depart at the head.– Use the list's removeFirst method.

OOP with Java, David J. Barnes

Collection Classes 16

Public interface of CardQueueclass CardQueue {

// Add a card to the queue. public void add(Card c){

getQueue().add(c); }

// Remove (and return) the next card. public Card next(){

return (Card) getQueue().removeFirst(); } ... // The collection of objects. private LinkedList queue = new LinkedList();}

OOP with Java, David J. Barnes

Collection Classes 17

Stacks

• Less common in everyday life.– Trays in a restaurant, cards in a discard pile.

• Common in programming languages.– Runtime stack, recursive functions.

• Enter at tail (push), remove from tail (pop).

• Similar interface to Queue, but different semantics.

OOP with Java, David J. Barnes

Collection Classes 18

Public interface of CardStackclass CardStack { // Add a card to the stack. public void add(Card c){

getStack().add(c); }

// Remove (and return) the last card. public Card next(){

return (Card) getStack().removeLast(); } ... // The collection of objects. private LinkedList stack = new LinkedList();}

OOP with Java, David J. Barnes

Collection Classes 19

Queue and Stack

• Additional peek and size methods commonly available for both.

• java.util.Stack is an example of inappropriate inheritance.

• Typed Queue and Stack classes easily created for other classes.– No generic types in Java.

OOP with Java, David J. Barnes

Collection Classes 20

Recursion

• Infinite recursion - often accidental.

• Bounded recursion. An alternative to iteration.

• Recursive solutions to divide-and-conquer problems.

OOP with Java, David J. Barnes

Collection Classes 21

Infinite Recursion

• Chicken or Egg conundrum.

• Apportioning blame.– She hit me, he hit me first, she did, he did, ...

• Inflationary spiral.– Raise prices to cover higher wages, raise wages

to cover higher prices, etc.

OOP with Java, David J. Barnes

Collection Classes 22

Chicken or Egg?

// Which came first?public void chickenOrEgg(String which){ System.out.println(which); if(which.equals("Chicken")){ chickenOrEgg("Egg"); } else{ chickenOrEgg("Chicken"); }}

• A method invokes itself.

OOP with Java, David J. Barnes

Collection Classes 23

Recursive Calls1:chickenOrEgg("Chicken") prints Chicken and calls2: chickenOrEgg("Egg"), which prints Egg and calls3: chickenOrEgg("Chicken"), which prints Chicken and calls4: chickenOrEgg("Egg"), which prints Egg and calls5: chickenOrEgg("Chicken"), which prints Chicken and calls ...

• An infinite sequence of numbers:public void sequencePrint(long n){ System.out.print(n+" "); sequencePrint(n+1); // Never reached ... System.out.println("End of print: "+n);}

OOP with Java, David J. Barnes

Collection Classes 24

Recursive Methods

• Direct recursion.– A method calls itself.

• Indirect recursion.– Method A calls method Z, and method Z calls

method A before it has finished.– Harder to spot potential problems.

OOP with Java, David J. Barnes

Collection Classes 25

Avoiding Infinite Recursion

• Loops can also be infinite.– The terminating condition is never triggered.

• There must be an 'escape route'.– A non-recursive path through a recursive

method.– It provides a limit on the depth of the recursion.

OOP with Java, David J. Barnes

Collection Classes 26

A Limited Recursive Sequencepublic void sequencePrint(long n){ final long limit = 5; if(n < limit){ System.out.print(n+" "); sequencePrint(n+1); System.out.println("End: "+n); }}

0 1 2 3 4 End: 4End: 3End: 2End: 1End: 0

OOP with Java, David J. Barnes

Collection Classes 27

Recursive Factorialpublic static long factorial(long n){ if(n == 0){ // The (non-recursive) base case. return 1; } else{ return n * factorial(n-1); }}

• The multiplications cannot be applied until the recursion unwinds.

OOP with Java, David J. Barnes

Collection Classes 28

Divide and Conquer Problems

• Divide and conquer problems often involve recursive solutions.

• A large data set can often be broken down quickly into smaller subsets.– The technique is applied recursively to each

sub-set.– The overall technique is applied recursively to a

single subset.

OOP with Java, David J. Barnes

Collection Classes 29

Recursive Binary SearchFind the mid-point;if(the target element is too big){ Try again to the right;}else if(the target element is too small){ Try again to the left;}else{ We have found it.}

• 'Try again' implies making a recursive call.

OOP with Java, David J. Barnes

Collection Classes 30

public int indexOf(int[] numbers, int value, which-part-to-examine){ final int notPresent = -1;

if(no-more-items-left){ return notPresent; } else{ int index = find-the-mid-point; if(value > numbers[index]){ return indexOf(numbers,value,right-hand-side); } else if(value < numbers[index]){ return indexOf(numbers,value,left-hand-side); } else{ return index; } }}

OOP with Java, David J. Barnes

Collection Classes 31

Review

• Many problems require flexible collections.

• Use ArrayList and LinkedList according to requirements.

• Use a cast when retrieving items.

• Use wrapper classes to store primitives.

• Use an Iterator to iterate through a collection.

OOP with Java, David J. Barnes

Collection Classes 32

Review (cont.)

• Collection classes often form the basis for further specializations.– Queue and Stack are the most common.

• Recursion is an alternative to iteration.– Methods may be directly or indirectly

recursive.– Avoiding infinite recursion requires a non-

recursive 'escape route'.

OOP with Java, David J. Barnes

Collection Classes 33

Review (cont.)

• Divide-and-conquer solutions often involve recursion.– Binary search is one example of a divide-and-

conquer solution.