Collections2

Download Report

Transcript Collections2

Collections
CS3250
Sources
 Slides by Professor Chuck Allison
 Core Java, by Cay S. Horstmann and Gary Cornell
 The Java Tutorial
 http://java.sun.com/docs/books/tutorial/index.html
Outline
 java.util.Arrays
 Comparing objects
 Generics
 Collections
 java.util.Collections
 Maps
java.util.Arrays
 Binary search
 equals
 fill
 sort
 asList
 toString
Comparing objects
 Comparable – implemented in class of objects being
compared
public interface Comparable<T> {
public int compareTo(T o);
}
"natural ordering"
 Comparator – implemented in class that is separate from
the class of the objects being compared
public interface Comparator<T> {
public int compare(T o1, T o2);
}
Generics
 New in Java 1.5
 Generic programming:
write code that can be reused for objects of
many different types
--Core Java (7th ed., p. 707)
Example
 The old way:
List inventory = new LinkedList();
inventory.add("Brass Lantern");
. . .
String item = (String) inventory.get(0);
 With generics:
List<String> inventory
= new LinkedList<String>();
inventory.add("Brass Lantern");
. . .
String item = inventory.get(0);
Advantages?
 The old way:
List inventory = new LinkedList();
inventory.add("Brass Lantern");
. . .
String item = (String) inventory.get(0);
 With generics:
List<String> inventory
= new LinkedList<String>();
inventory.add("Brass Lantern");
. . .
String item = inventory.get(0);
Advantages
 No casts needed
List inventory = new LinkedList();
inventory.add("Brass Lantern");
. . .
String item = (String) inventory.get(0);
 Compiler can check types
List<String> inventory
= new LinkedList<String>();
inventory.add("Brass Lantern");
. . .
String item = inventory.get(0);
Iterators
public interface Iterator<E> {
boolean hasNext();
E next();
void remove(); //optional
}
 Used to traverse collections
 How can a method be optional when implementations
are required for every method in the interface?
Using iterators
 Should always call hasNext before calling next
 Otherwise could get NoSuchElement exception
Iterator iter = c.iterator();
while (iter.hasNext()) {
String element = (String) iter.next();
// Do something with element
}
 Can use "for each" loop with any object that implements
Iterable interface
for (String element: c) {
// Do something with element
}
Iterators: C++ vs. Java
C++: iterators are modeled after
array indexes (pointers)
 Can advance position
independently of accessing
element
vector<int>::iterator iter;
for (iter = v.begin();
iter != v.end();
iter++) {
cout << *iter;
// Do more stuff with *iter
}
Groucho
Harpo
Chico
Java: like reading from a file
 Accessing elements and
advancing position are
inseparable
 Iterator is always "between"
elements
Iterator iter = c.iterator();
while (iter.hasNext()) {
String element = iter.next();
// Do something with element
}
Groucho
Harpo
Chico
Collections
 Interfaces
 Implementations
 List
 Set
 Queue
 Map
Separating interfaces and
implementations
 Specify implementation only when you construct
the collection object:
List<String> inventory = new LinkedList<String>();
inventory.add("Brass Lantern);
 Why is this a good approach?
Interface Hierarchy
Collection
List
Queue
Map
Set
SortedSet
SortedMap
public interface Collection<E> extends Iterable<E> {
// Basic operations
int size();
boolean isEmpty();
boolean contains(Object element);
boolean add(E element); //optional
boolean remove(Object element); //optional
Iterator<E> iterator();
// Bulk operations
boolean containsAll(Collection<?> c);
boolean addAll(Collection<? extends E> c); //optional
boolean removeAll(Collection<?> c);
//optional
boolean retainAll(Collection<?> c);
//optional
void clear();
//optional
// Array operations
Object[] toArray();
<T> T[] toArray(T[] a);
}
public interface Collection<E> extends Iterable<E> {
// Basic operations
int size();
boolean isEmpty();
boolean contains(Object element);
boolean add(E element);
//optional
boolean remove(Object element); //optional
Iterator<E> iterator();
// Bulk operations
boolean containsAll(Collection<?> c);
boolean addAll(Collection<? extends E> c); //optional
boolean removeAll(Collection<?> c);
//optional
boolean retainAll(Collection<?> c);
//optional
void clear();
//optional
// Array operations
Object[] toArray();
<T> T[] toArray(T[] a);
}
public interface Collection<E> extends Iterable<E> {
// Basic operations
int size();
boolean isEmpty();
boolean contains(Object element);
boolean add(E element);
//optional
boolean remove(Object element); //optional
Iterator<E> iterator();
// Bulk operations
boolean containsAll(Collection<?> c);
boolean addAll(Collection<? extends E> c); //optional
boolean removeAll(Collection<?> c);
//optional
boolean retainAll(Collection<?> c);
//optional
void clear();
//optional
// Array operations
Object[] toArray();
<T> T[] toArray(T[] a);
}
For more information about generic
wildcards (? and ? extends E) see
http://docs.oracle.com/javase/tutorial/
extra/generics/subtype.html
public interface Collection<E> extends Iterable<E> {
// Basic operations
int size();
boolean isEmpty();
boolean contains(Object element);
boolean add(E element);
//optional
boolean remove(Object element); //optional
Iterator<E> iterator();
// Bulk operations
boolean containsAll(Collection<?> c);
boolean addAll(Collection<? extends E> c); //optional
boolean removeAll(Collection<?> c);
//optional
boolean retainAll(Collection<?> c);
//optional
void clear();
//optional
// Array operations
Object[] toArray();
<T> T[] toArray(T[] a);
}
public interface Collection<E> extends Iterable<E> {
// Basic operations
int size();
boolean isEmpty();
boolean contains(Object element);
boolean add(E element);
//optional
boolean remove(Object element); //optional
Iterator<E> iterator();
// Bulk operations
boolean containsAll(Collection<?> c);
boolean addAll(Collection<? extends E> c); //optional
boolean removeAll(Collection<?> c);
//optional
boolean retainAll(Collection<?> c);
//optional
void clear();
//optional
// Array operations
Object[] toArray();
<T> T[] toArray(T[] a);
}
What do these optional
methods have in common?
Implementations
Interface
Implementations
Hash table
Set
Resizable
array
HashSet
List
Tree
TreeSet
ArrayList
Hash table + linked list
LinkedHashSet
LinkedList
Queue
Map
Linked list
LinkedList
HashMap
TreeMap
LinkedHashMap
List
 Ordered Collection
 Allows duplicate elements
 Provides positional access
 Permits arbitray range operations (sublists)
System.out.println(list.get(2));
0
1
2
3
pie
ice cream
cake
pie
List implementations
 LinkedList
 Quickly add and remove elements anywhere in the list
 Not well-suited for random access ("staggeringly
inefficient")
 ArrayList
 Works well for random access
 Takes more time to add and remove elements (except at
the end)
List iterators
public interface ListIterator<E> extends Iterator<E> {
boolean hasNext();
E next();
boolean hasPrevious();
Can move forward
E previous();
int nextIndex();
int previousIndex();
void remove(); //optional
void set(E e); //optional
void add(E e); //optional
}
• Must call next (or
previous) before calling
remove.
• remove deletes the element
just accessed.
or backward
element = iter.next()
System.out.println(element);
iter.remove();
Groucho
Harpo
Chico
Set
 Set interface contains only methods from
Collection.
 Cannot contain duplicate elements.
 Two sets are equal if they contain the same elements.
(Order is not important.)
pie
ice cream
cake
Set implementations
 HashSet – best performance, "chaotic
ordering"
 LinkedList – substantially slower, orders
elements based on values
 LinkedHashSet – orders elements based on
order of insertion into the set, performance
almost as good as HashSet
Set operations
 s1.containsAll(s2) – Returns true if s2 is subset
of s1
 s1.addAll(s2) – Transforms s1 into union of s1
and s2
 s1.retainAll(s2) – Transforms s1 into
intersection of s1 and s2
 s1.removeAll(s2) – Transforms s1 into the set
difference of s1 and s2
Queue
public interface Queue<E> extends Collection<E> {
E element();
boolean offer(E e);
E peek();
E poll();
E remove();
}
 "A collection for holding elements prior to processing"
(Java Tutorial)
 Typically use FIFO ordering, but there are other
orderings (e.g., priority queue)
 Ordering determines where an element will be added
and which element will be deleted.
Two forms of queue methods
Throws exception
Returns special value
Insert
add(e)
offer(e)
Remove
remove()
poll()
Examine
element()
peek()
 offer is intended only for use on bounded (fixed size)
queues. Returns false if element cannot be added.
 remove and poll remove and return the head of the
queue, which is determined by the queue's ordering.
 poll and peek return null if the queue is empty
java.util.Collections
 Sorting
 merge sort: fast (n log(n)) and stable
 Shuffling
 "Routine data manipulations"
 reverse, fill, copy, swap, addAll
 Searching – binarySearch
 Composition
 frequency, disjoint
Maps
 Stores key/value pairs of objects
 Duplicate keys are not allowed
 Not part of the Collection hierarchy
 Returns keys as a Set view
 Returns values as a Collection
public interface Map<K,V> {
V put(K key, V value);
V get(Object key);
V remove(Object key);
boolean containsKey(Object key);
boolean containsValue(Object value);
int size();
boolean isEmpty();
Basic Operations
Bulk Operations
void putAll(Map<? extends K, ? extends V> m);
void clear();
public Set<K> keySet();
public Collection<V> values();
public Set<Map.Entry<K,V>> entrySet();
public interface Entry {
K getKey();
V getValue();
V setValue(V value);
}
}
Collection Views
Interface for
entrySet elements
Word Frequency
import java.util.*;
public class Freq {
public static void main(String[] args) {
Map<String, Integer> m = new HashMap<String, Integer>();
// Initialize frequency table from command line
for (String a : args) {
Integer freq = m.get(a);
m.put(a, (freq == null) ? 1 : freq + 1);
}
System.out.println(m.size() + " distinct words:");
System.out.println(m);
}
}
java Freq if it is to be it is up to me to delegate
8 distinct words:
{to=3, delegate=1, be=1, it=2, up=1, if=1, me=1, is=2}
From the Java Tutorial: http://java.sun.com/docs/books/tutorial/collections/interfaces/map.html
Map<String, Integer> m = new _______<String, Integer>();
HashMap
java Freq if it is to be it is up to me to delegate
8 distinct words:
{to=3, delegate=1, be=1, it=2, up=1, if=1, me=1, is=2}
TreeMap
java Freq if it is to be it is up to me to delegate
8 distinct words:
{be=1, delegate=1, if=1, is=2, it=2, me=1, to=3, up=1}
LinkedMap
java Freq if it is to be it is up to me to delegate
8 distinct words:
{if=1, it=2, is=2, to=3, be=1, up=1, me=1, delegate=1}
Summary of implementations
 The Java Tutorial gives this list of "most
commonly used" implementations:
Set
List
Map
Queue
HashSet
ArrayList
HashMap
LinkedList