java programming transparency no. 1 java collections: built-in data structures for java cheng-chia...

59
Java Programming Transparency No. 1 Java Collections: Built-in Data Structures for Java Cheng-Chia Chen

Upload: lawrence-todd

Post on 12-Jan-2016

232 views

Category:

Documents


2 download

TRANSCRIPT

Page 1: Java Programming Transparency No. 1 Java Collections: Built-in Data Structures for Java Cheng-Chia Chen

Java Programming

Transparency No. 1

Java Collections:

Built-in Data Structures for Java

Cheng-Chia Chen

Page 2: Java Programming Transparency No. 1 Java Collections: Built-in Data Structures for Java Cheng-Chia Chen

Java Collection

Transparency No. 2

If your are not familiar with any of the following terms: List, Stack, Queue, Tree, Heap, hashtable

Please review your data structure book or read chapter 20 of the textbook carefully for topics related to these terms.

Page 3: Java Programming Transparency No. 1 Java Collections: Built-in Data Structures for Java Cheng-Chia Chen

Java Collection

Transparency No. 3

The Java Collection API

Interfaces: Collection (Iterable)

Set SortedSet, List Queue

Map SortedMap Iterator ListIterator Comparator

Note: After JDK5, all of above interfaces (and their implementations mentioned hereafter ) become generic types and hence are parameterized by a type variable <E>. I.e., Formally they should be Collection<E>, Set<E>, …, etc.

Queue

Page 4: Java Programming Transparency No. 1 Java Collections: Built-in Data Structures for Java Cheng-Chia Chen

Java Collection

Transparency No. 4

Summary of all interfaces in the java Collection API

Collection Interfaces : The primary means by which collections are manipulated.

( Iterable<E> ) Collection<E> Set<E>, List<E> A group of objects. May or may not be ordered; May or may not contain duplicates.

Set<E> SortedSet<E> The familiar set abstraction. No duplicates; May or may not be ordered.

SortedSet <E> elements automatically sorted, either in their natural ordering (see the

Comparable interface), or by a Comparator object provided when a SortedSet instance is created.

List<E> Ordered collection, also known as a sequence. Duplicates permitted; Allows positional access.

Page 5: Java Programming Transparency No. 1 Java Collections: Built-in Data Structures for Java Cheng-Chia Chen

Java Collection

Transparency No. 5

Queue<E> Deque<E> BlockingQueue<E> a First-in/First-out data container. Elements are appended to the ends

of the queue and are removed from the beginning of the queue. deque are double-ended queue.

Map<K,V> SortedMap<K,V> A mapping from keys to values. Each key can map to at most one value (function).

SortedMap <K,V> A map whose mappings are automatically sorted by key, either in the

keys' natural ordering or by a comparator provided when a SortedMap instance is created.

Page 6: Java Programming Transparency No. 1 Java Collections: Built-in Data Structures for Java Cheng-Chia Chen

Java Collection

Transparency No. 6

Infrastructure

Iterators : Similar to the Enumeration interface, but more powerful, and with improved method names.

Iterator<E> ListIterator<E> functionality of the Enumeration interface: {next(): E ; hasNext(): boolean ; remove() } supports element removement from the backing collection.

ListIterator<E> Iterator for use with lists. supports bi-directional iteration, element replacement, element insertion and index

retrieval.

Ordering Comparable <T> ( { compareTo( T object ) } )

Imparts a natural ordering to classes that implement it. The natural ordering may be used to sort a list or maintain order in a sorted set or map.

Many classes were designed to implement this interface. Comparator<T> ( { compare(T o1, T o2 ); equals(Object obj ) })

Represents an order relation, which may be used to sort a list or maintain order in a sorted set or map. Can override a type's natural ordering, or order objects of a type that does not implement the Comparable interface.

Page 7: Java Programming Transparency No. 1 Java Collections: Built-in Data Structures for Java Cheng-Chia Chen

Java Collection

Transparency No. 7

Infrastructure

Runtime Exceptions UnsupportedOperationException

Thrown by collections if an unsupported optional operation is called.

ConcurrentModificationException Thrown by Iterator and listIterator if the backing collection is modified

unexpectedly while the iteration is in progress. Also thrown by sublist views of lists if the backing list is modified

unexpectedly.

Page 8: Java Programming Transparency No. 1 Java Collections: Built-in Data Structures for Java Cheng-Chia Chen

Java Collection

Transparency No. 8

classes of the java collection API

AbstractCollection (Collection) AbstractSet (Set) TreeSet(SortedSet), HashSet LikedHashSet AbstractList (List) ArrayList, Vector Stack, AbstractSequentialList LinkedList (Deque) AbstractQueue(Queue) PriorityQueue

AbstractMap (Map) HashMap, Hashtable TreeMap (SortedMap) WeakHashMap

Arrays Collections

Legends: 1. superclass (interface) subclass 2. red : interface; brown :abstract; blue :concrete

Page 9: Java Programming Transparency No. 1 Java Collections: Built-in Data Structures for Java Cheng-Chia Chen

Java Collection

Transparency No. 9

General-Purpose Implementation classes

The primary implementations of the collection interfaces. HashSet : Hash table implementation of the Set interface. TreeSet : Red-black tree implementation of the SortedSet interface. ArrayList : Resizable-array implementation of the List interface.

(Essentially an unsynchronized Vector.) The best all-around implementation of the List interface.

LinkedList : Doubly-linked list implementation of the List interface. May provide better performance than the ArrayList implementation if elements are

frequently inserted or deleted within the list. Useful for queues and double-ended queues (dequeues).

HashMap : Hash table implementation of the Map interface. (Essentially an unsynchronized Hashtable that supports null keys and values.) The

best all-around implementation of the Map interface.

TreeMap : Red-black tree implementation of the SortedMap interface.

Page 10: Java Programming Transparency No. 1 Java Collections: Built-in Data Structures for Java Cheng-Chia Chen

Java Collection

Transparency No. 10

The java.util.Collection interface

represents a group of objects, known as its elements. no direct implementation The primary use : pass around collections of objects where

maximum generality is desired.

Ex: List l = new ArrayList( c ) ; // c is a Collection object

or List<E> = new ArrayList<E>( c );

// E: any reference Type; c : Collection<? extends E1>

Page 11: Java Programming Transparency No. 1 Java Collections: Built-in Data Structures for Java Cheng-Chia Chen

Java Collection

Transparency No. 11

The definition

public interface Collection <E> extends Iterable <E> {

// Basic properties

int size();

boolean isEmpty();

boolean contains(Object element); // use equals() for comparison

boolean equals(Object);

int hashCode(); // new equals() requires new hashCode()

// basic operations

boolean add(E e); // Optional; return true if this changed

boolean remove(E e); // Optional; use equals() (not ==)

Page 12: Java Programming Transparency No. 1 Java Collections: Built-in Data Structures for Java Cheng-Chia Chen

Java Collection

Transparency No. 12

The Collection interface definition

// Bulk Operations boolean containsAll(Collection <?> c); // true if c this // the following 4 methods are optional, returns true if contents changed boolean addAll(Collection<? extends E> c); // Optional; this = this U c boolean removeAll(Collection<?> c); // Optional; this = this - c boolean retainAll(Collection<?> c); // Optional; this = this c void clear(); // Optional; this = {}; // transformations

Iterator<E> iterator(); // collection iterator ; imple. of Iterable Object[ ] toArray(); // collection array <T> T[ ] toArray(T[ ] a ); // generic method with type <T>, not <E> // if |this| ≤ |a| => copy this to a and return a ; else => create a new array b // of the type T[ ] and copy this to b and return b; }

Page 13: Java Programming Transparency No. 1 Java Collections: Built-in Data Structures for Java Cheng-Chia Chen

Java Collection

Transparency No. 13

Why using Iterators instead of Enumerations Method names are simpler. Iterator allows the caller to remove elements from the underlying

collection. public interface Iterator <E> { boolean hasNext(); // cf: hasMoreElements() E next(); // cf: nextElement() void remove(); // Optional }// a simple Collection filter using iterator that Enumeration could not helpstatic <T> void filter(Collection<T> c) { for (Iterator<T> i = c.iterator(); i.hasNext(); ) { if ( no-good( i.next() ) ) i.remove(); // i.next() is removed from c i.remove(); // exception raised, cannot removed more than once ! } }

Page 14: Java Programming Transparency No. 1 Java Collections: Built-in Data Structures for Java Cheng-Chia Chen

Java Collection

Transparency No. 14

Ex ( Use raw type) :

Integer[ ] a1 = new Integer[] {1,2,3,4}.

List c = Arrays.asList( a1 ); // c = [1,2,3,4]

Iterator l = c.iterator();

While( l.hasNext() ) {

Integer k = (Integer) l.next() ;

if ( k .intValue == 3) l.remove();

}

c.println(); // c = [1,2,4]

Page 15: Java Programming Transparency No. 1 Java Collections: Built-in Data Structures for Java Cheng-Chia Chen

Java Collection

Transparency No. 15

Ex (use generic type) :

Integer[ ] a1 = new Integer[] {1,2,3,4}.

List <Integer> c = Arrays.asList( a1 ); // c = [1,2,3,4]

Iterator <Integer> l = c.iterator();

While( l.hasNext() ) {

Integer k = (Integer) l.next() ; // cast not needed

if ( k .intValue == 3) l.remove();

}

c.println(); // c = [1,2,4]

Page 16: Java Programming Transparency No. 1 Java Collections: Built-in Data Structures for Java Cheng-Chia Chen

Java Collection

Transparency No. 16

Examples of Bulk and array operations for Collection Remove all instances of an element e from a collection c:c.removeAll(Collections.singleton(e)); // remove all e’s in cc.removeAll(Collections.singleton(null)); // remove all nulls in c collections to arrays :Collection c = new LinkedList(); // LinkedList is an imp. of Col.c .add(“a”); c.add(“b”); // c == [“a”, “b”]; component type = ObjectObject[] ar1 = c.toArray(); // ok, ar1.length == 2String[] ar2 = (String[]) c.toArray(); // may cause runtime // exception, cannot cast an array of Object component type // to String[]; note: can pass compilation. String[] ar3 = (String[]) c.toArray(new String[0]); // ok! since

c.toArray(String[]) has String component type.

Page 17: Java Programming Transparency No. 1 Java Collections: Built-in Data Structures for Java Cheng-Chia Chen

Java Collection

Transparency No. 17

Examples of Bulk and array operations for Collection collections to arrays (use generic type) :Collection c = new LinkedList<String>();

c .add(“a”); c.add(“b”); // c == [“a”, “b”]; component type = ObjectObject[] ar1 = c.toArray(); // ar1.length == 2

String[] ar2 = (String[]) c.toArray();

String[] ar3 = (String[]) c.toArray(new String[0]); // still need pass a String[].

Page 18: Java Programming Transparency No. 1 Java Collections: Built-in Data Structures for Java Cheng-Chia Chen

Java Collection

Transparency No. 18

The Set Interface is a Collection that cannot contain duplicate elements. models the mathematical set abstraction. contains no methods other than those inherited from Collection.

same signatures but different semantics ( meaning ) Collection c = new LinkedList(); Set s = new HashSet(); String o = “a”; c.add(o); c.add(o) ; // both return true; c.size() == 2 s.add(o); s.add(o) ; // 2nd add() returns false; s.size() == 1

It adds the restriction that duplicate elements are prohibited. Collection noDups = new HashSet(c); // a simple way to eliminate

duplicate from c Two Set objects are equal if they contain the same elements. Two direct implementations:

HashSet TreeSet

Page 19: Java Programming Transparency No. 1 Java Collections: Built-in Data Structures for Java Cheng-Chia Chen

Java Collection

Transparency No. 19

Basic Operations A simple program to detect duplicates using set:import java.util.*;public class FindDups { public static void main(String args[]) { Set s = new HashSet(); // or use : new TreeSet() // following code uses Set methods only for (String arg : args ) if ( !s.add(arg) ) out.println("Duplicate detected: “ + arg ) ;

out.printf( s.size()+“ distinct words detected: “ +s ); } }% java FindDups i came i saw i left Duplicate detected: i Duplicate detected: i 4 distinct words detected: [came, left, saw, i]

Page 20: Java Programming Transparency No. 1 Java Collections: Built-in Data Structures for Java Cheng-Chia Chen

Java Collection

Transparency No. 20

Bulk Operations for Set objects

1. s1.containsAll(s2) returns true if s2 is a subset of s1.

2. s1.addAll(s2), s1.retainAll(s2), s1.removeAll(s2): s1 = s1 U s2, s1 = s1 s2, s1 = s1 – s2, respectively return true iff s1 is modified.

For nondestructive operations:

Set union = new HashSet(s1); // make a copy of s1

union.addAll(s2);

Set intersection = new HashSet(s1); // may also use TreeSet(s1)

intersection.retainAll(s2);

Set difference = new HashSet(s1);

difference.removeAll(s2);

Page 21: Java Programming Transparency No. 1 Java Collections: Built-in Data Structures for Java Cheng-Chia Chen

Java Collection

Transparency No. 21

Example

Show all arguments that occur exactly once and those that occur more than once.

import java.util.*; //use generics public class FindDups2 { public static void main(String args[]) { Set <String> uniques = new HashSet <String>(), dups = new HashSet <String> (); for (String arg : args ) if (! uniques.add(arg)) dups.add(arg ); uniques.removeAll(dups); // Destructive set-difference out.println("Unique words: " + uniques); out.println("Duplicate words: " + dups); } }

Page 22: Java Programming Transparency No. 1 Java Collections: Built-in Data Structures for Java Cheng-Chia Chen

Java Collection

Transparency No. 22

The List Interface

A List is an ordered Collection(sometimes called a sequence). may contain duplicate elements.

The List interface includes operations for: Positional Access: set/get elements based on their numerical position

in the list. Search: search for a specified object in the list and return its numerical

position. List Iteration: extend Iterator semantics to take advantage of the list's

sequential nature. Range-view: perform arbitrary range operations on the list.

Three direct implementations: ArrayList : resizable array LinkedList : doubly linked-list Vector : synchronized ArrayList.

Page 23: Java Programming Transparency No. 1 Java Collections: Built-in Data Structures for Java Cheng-Chia Chen

Java Collection

Transparency No. 23

The List interface definition

public interface List <E> extends Collection<E> {// Positional Access E get(int index); // 0-based E set(int index, E e); // Optional; return old value void add([int index,] E e); // Optional E remove(int index); // Optional; remove(Object) given in

Collection boolean addAll(int index, Collection<? extends E> c); // Optional// Search int indexOf(Object o); // the type of argument is Object! int lastIndexOf(Object o); // Range-view List<E> subList(int from, int to); // Iteration ; Iterator iterator() given in Collection + ListIterator<E> listIterator([int f] ); // default f = 0; return a listIterator with

cursor set to position f}

Page 24: Java Programming Transparency No. 1 Java Collections: Built-in Data Structures for Java Cheng-Chia Chen

Java Collection

Transparency No. 24

List in comparison with Older Vector (1.1)

shorter getter/setter names get(int) // elementAt(int) / add([ int, ] Object) // insertElemetnAt(O,i) Object set(int, Object) // void setElementAt(Object,int) Object remove(int) // void removeElementAt(int) Note: From java1.2 Vector also implements the List interface.

List concatenation: list1 = list1.addAll(list2); // destructive List list3 = new arrayList( list1); // or LinkedList(list1) list3.addAll(list2); // list3 equals to list1 . list2

Two List objects are equal if they contain the same elements in the same order. List l1 = new LinkedList(l2); // l2 is an ArrayList l1.equals(l2) ? true: false // returns true, but l1==l2 returns false.

Page 25: Java Programming Transparency No. 1 Java Collections: Built-in Data Structures for Java Cheng-Chia Chen

Java Collection

Transparency No. 25

ListIterator

public interface ListIterator<E> extends Iterator<E> { // from Iterator (forward iteration) boolean hasNext(); E next();// backward iteration: boolean hasPrevious(); E previous();

int nextIndex(); // == cursor position == pos of next() object int previousIndex(); // == nextIndex() – 1 = pos of previous() object // ; == -1 if cursor = 0; void remove(); // Optional void set(E e); // Optional void add(E e); // Optional }

E(0) E(1) E(2) E(3) ^ ^ ^ ^ ^ Index: 0 1 2 3 4 (cursor)

next()previous()

Page 26: Java Programming Transparency No. 1 Java Collections: Built-in Data Structures for Java Cheng-Chia Chen

Java Collection

Transparency No. 26

Set and Add operations in ListIterator

set(E), remove() : Replaces/remove the last element returned by next or previous with the specified element.

Ex: => either E(1) (if next() is called more recently than previous())

or E(2) (otherwise) would be replaced

add(Object o ): Inserts the specified element into the list, immediately before the current cursor position. Ex: add(o) => E(0) E(1) o (cursor) E(2) E(3)

Backward Iteration: for(ListIterator i = list.listIterator(list.size()); i.hasPrevious(); )

{ processing( i.previous()) ; }

E(0) E(1) E(2) E(3) ^ ^ ^ ^ ^ Index: 0 1 2 3 4 (cursor)

Page 27: Java Programming Transparency No. 1 Java Collections: Built-in Data Structures for Java Cheng-Chia Chen

Java Collection

Transparency No. 27

Some Examples

possible implementation of List.indexOf(Object):

public int indexOf(Object o) {

for (ListIterator i = listIterator(); i.hasNext(); )

if (o==null ? i.next()==null : o.equals(i.next()))

return i.previousIndex(); // or i.nextIndex() -1

return -1; // Object not found } replace all occurrences of one specified value with another:

public static void replace(List l, Object val, Object newVal) {

for (ListIterator i = l.listIterator(); i.hasNext(); )

if (val==null ? i.next()==null : val.equals(i.next()))

i.set(newVal); }

Page 28: Java Programming Transparency No. 1 Java Collections: Built-in Data Structures for Java Cheng-Chia Chen

Java Collection

Transparency No. 28

Range-view Operation

subList(int f, int t), returns a List view of a portion of this list whose indices range from f, inclusive, to t, exclusive, [f,t).

Ex:

sublist(1,3) = E(1),E(2)

This half-open range mirrors the typical for-loop:

for (int i=f; i<t; i++) { ... } // iterate over the sublist Change on sublist is reflected on the backing list

Ex: the following idiom removes a range of elements from a list:

list . subList(from, to) . clear();

E(0) E(1) E(2) E(3) ^ ^ ^ ^ ^ Index: 0 1 2 3 4 (cursor)

Page 29: Java Programming Transparency No. 1 Java Collections: Built-in Data Structures for Java Cheng-Chia Chen

Java Collection

Transparency No. 29

The Map Interface

A Map is an object that maps keys to values. A map cannot contain duplicate keys: Each key can map to at most one value. Three implementations:

HashMap, which stores its entries in a hash table, is the best-performing implementation.

TreeMap, which stores its entries in a red-black tree, guarantees the order of iteration.

Hashtable has also been retrofitted to implement Map.

All implementation must provide two constructors: (like Collections) Assume M is your implementation M() // empty map M(Map<? extends K, ? extends V> m) // a copy of map from m

Page 30: Java Programming Transparency No. 1 Java Collections: Built-in Data Structures for Java Cheng-Chia Chen

Java Collection

Transparency No. 30

The Map interface

public interface Map<K,V> { // Map does not extend Collection

// Basic Operations

// put or replace, return replaced object

V put(K key, V value); // optional ; old value or null returned

V get(K key);

V remove(Object key);

boolean containsKey(Object key);

boolean containsValue(Object value);

int size();

boolean isEmpty();

Page 31: Java Programming Transparency No. 1 Java Collections: Built-in Data Structures for Java Cheng-Chia Chen

Java Collection

Transparency No. 31

The Map interface

// Bulk Operations

void putAll(Map<?extends K, ? extends V> t); //optional

void clear(); // optional

// Collection Views;

// backed by the Map, change on either will be reflected on the other.

public Set<K> keySet(); // cannot duplicate by definition!!

public Collection<V> values(); // can duplicate

public Set<Map.Entry<K,V>> entrySet(); // no equivalent in Dictionary

// nested Interface for entrySet elements

public interface Entry<K,V> { equals(Object) + hashCode() +

K getKey();

V getValue();

V setValue(V value); } }

Page 32: Java Programming Transparency No. 1 Java Collections: Built-in Data Structures for Java Cheng-Chia Chen

Java Collection

Transparency No. 32

Possible Exceptions thrown by Map methods

UnsupportedOperationException if the method is not supported by this map.

ClassCastException if the class of a key or value in the specified map prevents it from being

stored in this map. ex: m.put(“Name”, new Integer(2)) // m actually put (String) value

IllegalArgumentException some aspect of a key or value in the specified map prevents it from

being stored in this map. ex: put(“Two”, 2) // put expect s an Object value

NullPointerException this map does not permit null keys or values, and the specified key or

value is null.

Page 33: Java Programming Transparency No. 1 Java Collections: Built-in Data Structures for Java Cheng-Chia Chen

Java Collection

Transparency No. 33

Basic Operations a simple program to generate a frequency tableimport java.util.*;public class Freq { private static final Integer ONE = new Integer(1); public static void main(String args[]) { Map m = new HashMap(); // or Map<String, Integer> m = … // Initialize frequency table from command line for (int i=0; i<args.length; i++) { Integer freq = (Integer) m.get(args[i]); // key is a string m.put(args[i], (freq==null ? ONE : new Integer( freq.intValue() + 1))); } // value is Integer System.out.println( m.size()+" distinct words detected:"); System.out.println(m); } } > java Freq if it is to be it is up to me to delegate 8 distinct words detected: {to=3, me=1, delegate=1, it=2, is=2, if=1, be=1, up=1}

Page 34: Java Programming Transparency No. 1 Java Collections: Built-in Data Structures for Java Cheng-Chia Chen

Java Collection

Transparency No. 34

Basic Operations ( after JDK 1.5) a simple program to generate a frequency tableimport java.util.*;public class Freq { private static final int ONE = 1; public static void main(String args[]) { Map<String, Integer> m = new HashMap<String, Integer>(); // Initialize frequency table from command line for (String arg : args) { Integer freq = m.get(arg); m.put( arg, (freq==null ? ONE : freq + 1)); // autoBox, autoUnbox used } // value is Integer System.out.println( m.size()+" distinct words detected:"); System.out.println(m); } } > java Freq if it is to be it is up to me to delegate 8 distinct words detected: {to=3, me=1, delegate=1, it=2, is=2, if=1, be=1, up=1}

Page 35: Java Programming Transparency No. 1 Java Collections: Built-in Data Structures for Java Cheng-Chia Chen

Java Collection

Transparency No. 35

Bulk Operations

clear() : removes all of the mappings from the Map. putAll(Map) operation is the Map analogue of the

Collection interface's addAll(…) operation. can be used to create attribute map creation with default

values. Here's a static factory method demonstrating this technique:

static <K,V> Map<K,V> newAttributeMap(Map<K,V> defaults, Map<?extends K, V extends V> overrides) {

Map<K,V> result = new HashMap<K,V> (defaults);

result.putAll(overrides);

return result;

}

Page 36: Java Programming Transparency No. 1 Java Collections: Built-in Data Structures for Java Cheng-Chia Chen

Java Collection

Transparency No. 36

Collection Views methods allow a Map to be viewed as a Collection in three ways:

keySet: the Set of keys contained in the Map. values: The Collection of values contained in the Map. This Collection is not a Set, as

multiple keys can map to the same value. entrySet: The Set of key-value pairs contained in the Map. The Map interface provides a small nested interface called Map.Entry that is the type

of the elements in this Set. the standard idiom for iterating over the keys in a Map: for (Iterator i = m.keySet().iterator(); i.hasNext(); ) {

System.out.println(i.next());

if(no-good(…)) i.remove() ; } // support removal from the back Map Iterating over key-value pairs

for (Iterator i=m.entrySet().iterator(); i.hasNext(); ) {

Map.Entry e = (Map.Entry) i.next();

System.out.println(e.getKey() + ": " + e.getValue()); }

Page 37: Java Programming Transparency No. 1 Java Collections: Built-in Data Structures for Java Cheng-Chia Chen

Java Collection

Transparency No. 37

Permutation groups of words

import java.util.*; import java.io.*;public class Perm { public static void main(String[] args) { int minGroupSize = Integer.parseInt(args[1]); // Read words from file and put into simulated multimap Map<String, List<String>> m = new HashMap<String, List<String> (); try { Scanner in = new Scanner(new File(args[0])); while(in.hasNext()) { String word = in.nextLine() ; // or word = in.next() String alpha = alphabetize(word); // normalize word : success ccesssu List <String> l = m.get(alpha); if (l==null) m.put(alpha, l=new ArrayList<String> () ); l.add(word); } } catch(Exception e) { System.err.println(e); System.exit(1); }

Page 38: Java Programming Transparency No. 1 Java Collections: Built-in Data Structures for Java Cheng-Chia Chen

Java Collection

Transparency No. 38

// Print all permutation groups above size threshold

for (Iterator<List<String>> i = m.values().iterator(); i.hasNext(); ) {

List<String> l = (List) i.next();

if (l.size() >= minGroupSize)

System.out.println(l.size() + ": " + l);

} }

Page 39: Java Programming Transparency No. 1 Java Collections: Built-in Data Structures for Java Cheng-Chia Chen

Java Collection

Transparency No. 39

// buketsort implementationprivate static String alphabetize(String s) { int count[] = new int[256]; int len = s.length(); for (int i=0; i<len; i++) count[s.charAt(i)]++; StringBuffer result = new StringBuffer(len); for (char c='a'; c<='z'; c++) for (int i=0; i<count[c]; i++) result.append(c); return result.toString(); } }

Page 40: Java Programming Transparency No. 1 Java Collections: Built-in Data Structures for Java Cheng-Chia Chen

Java Collection

Transparency No. 40

Some results

% java Perm dictionary.txt 89: [estrin, inerts, insert, inters, niters, nitres, sinter, triens, trines]8: [carets, cartes, caster, caters, crates, reacts, recast, traces]9: [capers, crapes, escarp, pacers, parsec, recaps, scrape, secpar, spacer]8: [ates, east, eats, etas, sate, seat, seta, teas]12: [apers, apres, asper, pares, parse, pears, prase, presa, rapes, reaps, spare,

spear]9: [anestri, antsier, nastier, ratines, retains, retinas, retsina, stainer, stearin]10: [least, setal, slate, stale, steal, stela, taels, tales, teals, tesla]8: [arles, earls, lares, laser, lears, rales, reals, seral]8: [lapse, leaps, pales, peals, pleas, salep, sepal, spale]8: [aspers, parses, passer, prases, repass, spares, sparse, spears]8: [earings, erasing, gainers, reagins, regains, reginas, searing, seringa]11: [alerts, alters, artels, estral, laster, ratels, salter, slater, staler, stelar, talers]9: [palest, palets, pastel, petals, plates, pleats, septal, staple, tepals] …

Page 41: Java Programming Transparency No. 1 Java Collections: Built-in Data Structures for Java Cheng-Chia Chen

Java Collection

Transparency No. 41

The SortedSet Interface

A SortedSet is a Set that maintains its elements in ascending order, sorted according to the elements' natural order(via comparable interface), or according to a Comparator provided at SortedSet creation time.

In addition to the normal Set operations, the SortedSet interface provides operations for: Range-view: Performs arbitrary range operations on the sorted set. Endpoints: Returns the first or last element in the sorted set. Comparator access: Returns the Comparator used to sort the set (if

any). Standard constructors: Let S be the implementation

S( [ Comparator ] ) // empty set S(SortedSet) // copy set

Implementation: TreeSet

Page 42: Java Programming Transparency No. 1 Java Collections: Built-in Data Structures for Java Cheng-Chia Chen

Java Collection

Transparency No. 42

The SortedSet

public interface SortedSet<E> extends Set<E> {

// Range-view

SortedSet<E> subSet(E f, E t); // return [ f, t ), f.eq(t) ->null

SortedSet<E> headSet(E t); // [first(), t )

SortedSet<E> tailSet(E fromElement);// [f, last() ]

// Endpoints

E first();

E last();

// Comparator access

Comparator<? super E> comparator(); // return null if natural order is used.

}

Page 43: Java Programming Transparency No. 1 Java Collections: Built-in Data Structures for Java Cheng-Chia Chen

Java Collection

Transparency No. 43

The SortedMap Interface

A SortedMap is a Map that maintains its entries in ascending order, sorted according to the keys‘ natural order, or according to a Comparator provided at SortedMap creation time.

In addition to the normal Map operations, the SortedMap interface provides operations for: Range-view: Performs arbitrary range operations on the sorted map. Endpoints: Returns the first or last key in the sorted map. Comparator access: Returns the Comparator used to sort the map (if

any).

Constructors provided by implementations: M([Comparator]) // empty SortedMap M(SortedMap) // copy Map

Implementation: TreeMap

Page 44: Java Programming Transparency No. 1 Java Collections: Built-in Data Structures for Java Cheng-Chia Chen

Java Collection

Transparency No. 44

The SortedMap interface

// analogous to SortedSetpublic interface SortedMap<K,V> extends Map<K,V> { Comparator<? super K> comparator();// range-view operations SortedMap<K,V> subMap(K fromKey, K toKey); SortedMap<K,V> headMap(K toKey); SortedMap<K,V> tailMap(K fromKey);// member access; // Don’t forget bulk of other Map operations available K firstKey(); K lastKey(); } // throws NoSuchElementException if m.isEmpty()

Page 45: Java Programming Transparency No. 1 Java Collections: Built-in Data Structures for Java Cheng-Chia Chen

Java Collection

Transparency No. 45

SortedMap Operations

Operations inheriting from Map behave identically to normal maps with two exceptions: [keySet() | entrySet() | values()] . Iterator() traverse the collections in

key-order. toArray(…) contains the keys, values, or entries in key-order.

Although not guaranteed by the interface, the toString() method of SortedMap in all the JDK's SortedMap returns

a string containing all the elements in key-order.

Page 46: Java Programming Transparency No. 1 Java Collections: Built-in Data Structures for Java Cheng-Chia Chen

Java Collection

Transparency No. 46

Example

SortedMap<String,String> m = new TreeMap<String,String>(); m.put("Sneezy", "common cold"); m.put("Sleepy", "narcolepsy"); m.put("Grumpy", "seasonal affective disorder");

System.out.println( m.keySet() ); System.out.println( m.values() ); System.out.println( m.entrySet() );

Running this snippet produces this output: [ Grumpy, Sleepy, Sneezy][ seasonal affective disorder, narcolepsy, common cold][ Grumpy=seasonal affective disorder, Sleepy=narcolepsy, Sneezy=common cold]

Page 47: Java Programming Transparency No. 1 Java Collections: Built-in Data Structures for Java Cheng-Chia Chen

Java Collection

Transparency No. 47

Actual Collection and Map Implementations

Implementations are the actual data objects used to store collections (and Maps).

Three kinds of implementations: General-purpose Implementations

the public classes that provide the primary implementations of the core interfaces.

Wrapper Implementations used in combination with other implementations (often the general-

purpose implementations) to provide added functionality. Convenience Implementations

Convenience implementations are mini-implementations, typically made available via static factory methods that provide convenient, efficient alternatives to the general-purpose implementations for special collections (like singleton sets).

Page 48: Java Programming Transparency No. 1 Java Collections: Built-in Data Structures for Java Cheng-Chia Chen

Java Collection

Transparency No. 48

General Purpose Implementations

Hash TableResizable

arraybalanced

treelinked list

Set HashSetTreeSet

(sortedSet)

ListArrayList

VectorLinkedList

MapHashMap

Hashtable

TreeMap

(sortedMap)

Page 49: Java Programming Transparency No. 1 Java Collections: Built-in Data Structures for Java Cheng-Chia Chen

Java Collection

Transparency No. 49

Properties of the implementations

consistent names as well as consistent behavior. fully implementations [of all the optional operations]. All permit null elements, keys and values. unsynchronized.

remedy the deficiency of Hashtable and Vector can become synchronized through the synchronization wrappers

All have fail-fast iterators, which detect illegal concurrent modification during iteration and fail quickly and cleanly.

All are Serializable, all support a public clone() method. should be thinking about the interfaces rather than the

implementations. The choice of implementation affects only performance.

Page 50: Java Programming Transparency No. 1 Java Collections: Built-in Data Structures for Java Cheng-Chia Chen

Java Collection

Transparency No. 50

HashSet vs treeSet (and HashMap vs TreeMap)

HashSet/ HashMap is much faster (constant time vs. log time for most operations), but offers no ordering guarantees.

always use HashSet/HashMap unless you need to use the operations in the SortedSet, or in-order iteration.

choose an appropriate initial capacity of your HashSet if iteration performance is important. The default initial capacity is 101, and that's often more than you need. can be specified using the int constructor. Set s= new HashSet(17); // set bucket size to 17

Page 51: Java Programming Transparency No. 1 Java Collections: Built-in Data Structures for Java Cheng-Chia Chen

Java Collection

Transparency No. 51

ArrayList vs LinkedList

Most of the time, you'll probably use ArrayList. offers constant time positional access Think of ArrayList as Vector without the synchronization overhead.

Use LikedList If you frequently add elements to the beginning of the List, or iterate over the List deleting elements from its interior. These operations are constant time in a LinkedList but linear time in

an ArrayList.

Page 52: Java Programming Transparency No. 1 Java Collections: Built-in Data Structures for Java Cheng-Chia Chen

Java Collection

Transparency No. 52

Wrapper Implementations

are implementations that delegate all of their real work to a specified collection, but add some extra functionality on top of what this collection offers.

These implementations are anonymous: the JDK provides a static factory method. All are found in the Collections class which consists solely of static

methods. Synchronization Wrappers //K,V,E are method type parameters

public static Collection<E> synchronizedCollection(Collection <E> c); public static Set<E> synchronizedSet(Set<E> s); public static List<E> synchronizedList(List <E> list); public static Map<K,V> synchronizedMap(Map<K,V> m); public static SortedSet<E> synchronizedSortedSet(SortedSet<E> s); public static SortedMap<K,V> synchronizedSortedMap(SortedMap

<K,V>m);

Page 53: Java Programming Transparency No. 1 Java Collections: Built-in Data Structures for Java Cheng-Chia Chen

Java Collection

Transparency No. 53

read-only access to Collection/Maps

Unmodifiable Wrappers public static Collection<E> unmodifiableCollection(Collection<E> c); public static Set<E> unmodifiableSet(Set<E> s); public static List<E> unmodifiableList(List<E> list); public static Map<K,V> unmodifiableMap(Map<K,V> m); public static SortedSet<E> unmodifiableSortedSet(SortedSet<E> s); public static SortedMap<K,V> unmodifiableSortedMap ( SortedMap

<K,V> m);

Page 54: Java Programming Transparency No. 1 Java Collections: Built-in Data Structures for Java Cheng-Chia Chen

Java Collection

Transparency No. 54

Convenience Implementations

mini-implementations that can be more convenient and more efficient then the general purpose implementations

available via static factory methods or exported constants in class Arrays or Collections.

List-view of an Array List l = Arrays.asList(new Object[100]); // list of 100 null’s.

Immutable Multiple-Copy List List l = new ArrayList(Collections.nCopies(1000, new Integer(1)));

Immutable Singleton Set c.removeAll(Collections.singleton(e)); profession.values().removeAll(Collections.singleton(LAWYER));

(Immutable) Empty Set and Empty List Constants Collections.EMPTY_SET Collections.EMPTY_LIST Collections.EMPTY_MAP // add(“1”) UnsupportedOp… Exception

Page 55: Java Programming Transparency No. 1 Java Collections: Built-in Data Structures for Java Cheng-Chia Chen

Java Collection

Transparency No. 55

Convenience Implementations

(Immutable) Empty Set and Empty List methods <E> Set<E> emptySet() <E> List<E> emptyList() <K,V> Map<K,V> emptyMap()

Page 56: Java Programming Transparency No. 1 Java Collections: Built-in Data Structures for Java Cheng-Chia Chen

Java Collection

Transparency No. 56

The Arrays class

static List asList(Object[] a) // a could not be of the type int[],… Returns a fixed-size list backed by the specified array. cannot add/remove();

static int binarySearch(Type[] a, Type key) Searches the specified array of bytes for the specified value using the binary search

algorithm. Type can be any primitive type or Object.

static boolean equals(Type[] a1, Type[] a2) static void fill(Type[] a [,int f, int t], Type val)

Assigns the specified val to each element of the specified array of Type.

static void sort(Type[] a [, int f, int t]) Sorts the specified range of the specified array into ascending numerical order.

static sort(Object[] a, Comparator c [,int f, int t ]) Sorts the specified array of objects according to the order induced by the specified

comparator.

Page 57: Java Programming Transparency No. 1 Java Collections: Built-in Data Structures for Java Cheng-Chia Chen

Java Collection

Transparency No. 57

The Collections class

static int binarySearch(List list, Object key [, Comparator c]) static void copy(List dest, List src) // foreach i d.set(i, s.get(i));static Enumeration enumeration(Collection c)

Returns an enumeration over the specified collection.

static void fill(List list, Object o) static Object max(Collection coll [, Comparator comp] ) static Object min(Collection coll [, Comparator comp] ) static List nCopies(int n, Object o) static void reverse(List l) static Set singleton(Object o) static Comparator reverseOrder() // assume a is of type String[] // usage: Arrays.sort(a, Collections.reverseOrder());static void shuffle(List list [, Random rnd]) static void swap(List, int, int)static void rotate(List, int d) ;// obj at i moved to ( i - d mod size())

Page 58: Java Programming Transparency No. 1 Java Collections: Built-in Data Structures for Java Cheng-Chia Chen

Java Collection

Transparency No. 58

The implementation of reverseOrder()

public static Comparator reverseOrder() { return REVERSE_ORDER; }

private static final Comparator REVERSE_ORDER = new ReverseComparator();

private static class ReverseComparator implements Comparator,Serializable {

public int compare(Object o1, Object o2) { Comparable c1 = (Comparable)o1; Comparable c2 = (Comparable)o2; return -c1.compareTo(c2); } }

Page 59: Java Programming Transparency No. 1 Java Collections: Built-in Data Structures for Java Cheng-Chia Chen

Java Collection

Transparency No. 59

The Collections class

static List singletonList(Object o)

static Map singletonMap(Object key, Object value)

static void sort(List list, Comparator c)

static Collection synchronizedCollection(Collection c) …

static Collection unmodifiableCollection(Collection c) …

static List EMPTY_LIST //The empty list (immutable).

static Map EMPTY_MAP //The empty map (immutable).

static Set EMPTY_SET //The empty set (immutable).