Lists I The List ADT Textbook Sections 3
Lists - I The List ADT Textbook Sections 3. 1 - 3. 4
List ADT n n n A list is a dynamic ordered tuple of homogeneous elements Ao, A 1, A 2, …, AN-1 where Ai is the i-th element of the list The position of element Ai is i; positions range from 0 to N-1 inclusive The size of a list is N ( a list with no elements is called an “empty list”) 8/3/2007 CMSC 341 Lists 1 2
Generic Operations on a List n n n n n create an empty list print. List() – prints all elements in the list construct a (deep) copy of a list find(x) – returns the position of the first occurrence of x remove(x) – removes x from the list if present insert(x, position) – inserts x into the list at the specified position is. Empty( ) – returns true if the list has no elements make. Empty( ) – removes all elements from the list find. Kth(int k) – returns the element in the specified position 8/3/2007 CMSC 341 Lists 1 3
Simple Array Implementation of a List n Use an array to store the elements of the list q q q n print. List is O(n) findkth, get and set are constant time Insert and delete? Also, arrays have a fixed capacity, but can fix with implementation. int arr[] = new int arr[10]; int new. Arr[] = new int[arr. length *2]; for(int i = 0; i < arr. length; i++) new. Arr[i] = arr[i]; arr = new. Arr; 8/3/2007 CMSC 341 Lists 1 4
Simple Linked List Implementation Linked List Deletion 8/3/2007 CMSC 341 Lists 1 5
Linked List Implementation of a List Insertion Notice insert and delete can be constant time if node is inserted at beginning of List; however, findkth is now O(i). 8/3/2007 CMSC 341 Lists 1 6
The List ADT in Java Collections n n n The List ADT is one of the data structures implemented in the Java Collections API. A list is abstracted using an inheritance hierarchy that stems from the Collection<E> interface , List<E>Interface in the java. util package and from the Iterable<E> interface in the java. lang package. The combination of these interfaces provides a uniform public interface for all Lists in Java 8/3/2007 CMSC 341 Lists 1 7
Methods from the Collections List //from Collection interface ADT int size( ); boolean is. Empty( ); void clear( ); boolean contains( Any. Type x ); boolean add( Any. Type x ); boolean remove( Any. Type x ); java. util. Iterator<Any. Type> iterator( ); //from List interface Any. Type get( int idx ); Any. Type set( int idx, Any. Type new. Val ); void add( int idx, Any. Type x ); void remove( int idx ); List. Iterator<Any. Type> list. Iterator(int pos); 8/3/2007 CMSC 341 Lists 1 8
The Iterator<E> Interface n n The Collections framework provides two very useful interfaces for traversing a Collection. The first is the Iterator<E> interface. When the iterator method is called on a Collection, it returns an Iterator object which has the following methods for traversing the Collection. boolean has. Next( ); Any. Type next( ); void remove( ); 8/3/2007 CMSC 341 Lists 1 9
Using an Iterator to Traverse a Collection public static <Any. Type> void print( Collection<Any. Type> coll ) { Iterator<Any. Type> itr = coll. iterator( ); while( itr. has. Next( ) ){ Any. Type item = itr. next( ); System. out. println( item ); } } 8/3/2007 CMSC 341 Lists 1 10
The Enhanced for Loop n The enhanced for loop in Java actually calls the iterator method when traversing a Collection and uses the Iterator to traverse the Collection when translated into byte code. public static <Any. Type> void print( Collection<Any. Type> coll ) { for( Any. Type item : coll ) System. out. println( item ); } 8/3/2007 CMSC 341 Lists 1 11
The List. Iterator<E> Interface The second interface for traversing a Collection is the List. Iterator<E> interface. It allows for the bidirectional traversal of a List. boolean has. Previous( ); Any. Type previous( ); void add( Any. Type x ); void set( Any. Type new. Val ); n n A List. Iterator object is returned by invoking the list. Iterator method on a List. 8/3/2007 CMSC 341 Lists 1 12
Concrete Implementations of the List ADT in the Java Collections API n Two concrete implementations of the List API in the Java Collections API with which you are already familiar are: q q n java. util. Array. List java. util. Linked. List Let’s examine the methods of these concrete classes that were developed at Sun. 8/3/2007 CMSC 341 Lists 1 13
List Operations on an Array. List<E> Supports constant time for n q q 8/3/2007 insertion at the “end” of the list using void add(E element) deletion from the “end” of the list using E remove(int index) access to any element of the list using E get(int index) changing value of any element of the list using E set(int index, E element) CMSC 341 Lists 1 14
List Operations on an Array. List<E> (cont. ) What is the growth rate for the following? n q q 8/3/2007 insertion at the “beginning” of the list using void add(int index, E element) deletion from the “beginning” of the list using E remove(int index) CMSC 341 Lists 1 15
List Operations on a Linked. List<E> n 8/3/2007 Provides doubly linked list implementation CMSC 341 Lists 1 16
List Operations on a Linked. List<E> Supports constant time for n q insertion at the “beginning” of the list using void add. First(E o) q q insertion at the “end” of the list using void add. Last(E o) deletion from the “beginning” of the list using E remove. First() deletion from the “end” of the list using E remove. Last() Accessing first element of the list using E get. First() q 8/3/2007 Accessing first element of the list using E get. Last() CMSC 341 Lists 1 17
List Operations on a Linked. List<E> What is the growth rate for the following? n q 8/3/2007 access to the “middle” element of the list using E get(int index) CMSC 341 Lists 1 18
Example 1 –Array. List vs. Linked. List What is the running time for an Array. List versus a Linked. List? public static void make. List 1(List<Integer> list, int N) { list. clear(); for(int i = 0; i < N; i++) list. add(i); } n 8/3/2007 CMSC 341 Lists 1 19
Example 2 –Array. List vs. Linked. List What is the running time for an Array. List versus a Linked. List? public static void make. List 2(List<Integer> list, int N) { list. clear()l for(int i = 0; i < N; i++) list. add(0, i); } n 8/3/2007 CMSC 341 Lists 1 20
Example 3 –Array. List vs. Linked. List n What is the running time for an Array. List versus a Linked. List? public static int sum(List<Integer> list, int N) { int total = 0; for(int i = 0; i < N ; i++) total += list. get(i); return total; } n How can we change this code so the running time for both is the same? 8/3/2007 CMSC 341 Lists 1 21
Example 4 –Array. List vs. Linked. List What is the running time for an Array. List versus a Linked. List? public static void remove. Evens. Ver 3(List<Integer> lst ) { Iterator<Integer> itr = lst. iterator( ); n while( itr. has. Next( ) ) if( itr. next( ) % 2 == 0 ) itr. remove( ); } 8/3/2007 CMSC 341 Lists 1 22
Implementing Your Own Array. List What do you need? n Store elements in a parameterized array 2. Track number of elements in array (size) and capacity of array public class My. Array. List<Any. Type> implements Iterable<Any. Type> { private static final int DEFAULT_CAPACITY=10; private int the. Size; private Any. Type [ ] the. Items; 1. 8/3/2007 CMSC 341 Lists 1 23
3. Ability to change capacity of the array public void ensure. Capacity( int new. Capacity ) { if( new. Capacity < the. Size ) return; Any. Type [ ] old = the. Items; the. Items = (Any. Type []) new Object[ new. Capacity ]; for( int i = 0; i < size( ); i++ ) the. Items[ i ] = old[ i ]; } 8/3/2007 CMSC 341 Lists 1 24
4. get and set Methods public Any. Type get( int idx ) { if( idx < 0 || idx >= size( ) ) throw new Array. Index. Out. Of. Bounds. Exception(); return the. Items[ idx ]; } public Any. Type set( int idx, Any. Type new. Val ) { if( idx < 0 || idx >= size( ) ) throw new Array. Index. Out. Of. Bounds. Exception( ); Any. Type old = the. Items[ idx ]; the. Items[ idx ] = new. Val; return old; } 8/3/2007 CMSC 341 Lists 1 25
5. size, is. Empty, and clear Methods public void clear( ){ the. Size = 0; ensure. Capacity( DEFAULT_CAPACITY ); } public int size( ){ return the. Size; } public boolean is. Empty( ){ return size( ) == 0; } // constructor invokes the clear method public My. Array. List( ){ clear( ); } 8/3/2007 CMSC 341 Lists 1 26
6. add Methods public boolean add( Any. Type x ){ add( size( ), x ); return true; } public void add( int idx, Any. Type x ){ if( the. Items. length == size( ) ) ensure. Capacity( size( ) * 2 + 1 ); for( int i = the. Size; i > idx; i-- ) the. Items[ i ] = the. Items[ i - 1 ]; the. Items[ idx ] = x; the. Size++; } 8/3/2007 CMSC 341 Lists 1 27
7. remove and iterator Method public Any. Type remove( int idx ){ Any. Type removed. Item = the. Items[ idx ]; for( int i = idx; i < size( ) - 1; i++ ) the. Items[ i ] = the. Items[ i + 1 ]; the. Size--; return removed. Item; } //required by Iterable<E> interface public java. util. Iterator<Any. Type> iterator( ){ return new Array. List. Iterator( ); } 8/3/2007 CMSC 341 Lists 1 28
8. Iterator class // private inner class for iterator private class Array. List. Iterator implements java. util. Iterator<Any. Type> { private int current = 0; Implicit reference to outer class method public boolean has. Next( ) { return current < size( ); } Implicit ref. to outer class data public Any. Type next( ) { return the. Items[ current++ ]; } public void remove( ) { My. Array. List. this. remove( --current ); } } Explicit reference to } outer class method 8/3/2007 CMSC 341 Lists 1 29
The Iterator and Java Inner classes n The implementation of the Iterator class required an inner class to allow one or more instances of Iterator for one outer class. 8/3/2007 CMSC 341 Lists 1 30
Sorted Lists n n Suppose we decided that the data in the lists should be stored in sorted order. How would the sorted order be determined? What List code would need to be changed? How would sorting the data affect the performance of q q 8/3/2007 Finding an element in the list Inserting an element into the list Removing an element from the list other List functions CMSC 341 Lists 1 31
- Slides: 31