Merged gcj-eclipse branch to trunk.
From-SVN: r120621
This commit is contained in:
parent
c648dedbde
commit
97b8365caf
17478 changed files with 606493 additions and 100744 deletions
|
@ -90,8 +90,8 @@ import java.io.Serializable;
|
|||
* @since 1.2
|
||||
* @status updated to 1.4
|
||||
*/
|
||||
public class TreeMap extends AbstractMap
|
||||
implements SortedMap, Cloneable, Serializable
|
||||
public class TreeMap<K, V> extends AbstractMap<K, V>
|
||||
implements SortedMap<K, V>, Cloneable, Serializable
|
||||
{
|
||||
// Implementation note:
|
||||
// A red-black tree is a binary search tree with the additional properties
|
||||
|
@ -140,7 +140,7 @@ public class TreeMap extends AbstractMap
|
|||
/**
|
||||
* The cache for {@link #entrySet()}.
|
||||
*/
|
||||
private transient Set entries;
|
||||
private transient Set<Map.Entry<K,V>> entries;
|
||||
|
||||
/**
|
||||
* Counts the number of modifications this TreeMap has undergone, used
|
||||
|
@ -154,7 +154,7 @@ public class TreeMap extends AbstractMap
|
|||
* Package visible for use by nested classes.
|
||||
* @serial the comparator ordering this tree, or null
|
||||
*/
|
||||
final Comparator comparator;
|
||||
final Comparator<? super K> comparator;
|
||||
|
||||
/**
|
||||
* Class to represent an entry in the tree. Holds a single key-value pair,
|
||||
|
@ -162,25 +162,25 @@ public class TreeMap extends AbstractMap
|
|||
*
|
||||
* @author Eric Blake (ebb9@email.byu.edu)
|
||||
*/
|
||||
private static final class Node extends AbstractMap.BasicMapEntry
|
||||
private static final class Node<K, V> extends AbstractMap.SimpleEntry<K, V>
|
||||
{
|
||||
// All fields package visible for use by nested classes.
|
||||
/** The color of this node. */
|
||||
int color;
|
||||
|
||||
/** The left child node. */
|
||||
Node left = nil;
|
||||
Node<K, V> left = nil;
|
||||
/** The right child node. */
|
||||
Node right = nil;
|
||||
Node<K, V> right = nil;
|
||||
/** The parent node. */
|
||||
Node parent = nil;
|
||||
Node<K, V> parent = nil;
|
||||
|
||||
/**
|
||||
* Simple constructor.
|
||||
* @param key the key
|
||||
* @param value the value
|
||||
*/
|
||||
Node(Object key, Object value, int color)
|
||||
Node(K key, V value, int color)
|
||||
{
|
||||
super(key, value);
|
||||
this.color = color;
|
||||
|
@ -210,7 +210,7 @@ public class TreeMap extends AbstractMap
|
|||
* @param c the sort order for the keys of this map, or null
|
||||
* for the natural order
|
||||
*/
|
||||
public TreeMap(Comparator c)
|
||||
public TreeMap(Comparator<? super K> c)
|
||||
{
|
||||
comparator = c;
|
||||
fabricateTree(0);
|
||||
|
@ -230,7 +230,7 @@ public class TreeMap extends AbstractMap
|
|||
* @throws NullPointerException if map is null
|
||||
* @see Comparable
|
||||
*/
|
||||
public TreeMap(Map map)
|
||||
public TreeMap(Map<? extends K, ? extends V> map)
|
||||
{
|
||||
this((Comparator) null);
|
||||
putAll(map);
|
||||
|
@ -244,7 +244,7 @@ public class TreeMap extends AbstractMap
|
|||
* @param sm a SortedMap, whose entries will be put into this TreeMap
|
||||
* @throws NullPointerException if sm is null
|
||||
*/
|
||||
public TreeMap(SortedMap sm)
|
||||
public TreeMap(SortedMap<K, ? extends V> sm)
|
||||
{
|
||||
this(sm.comparator());
|
||||
int pos = sm.size();
|
||||
|
@ -313,7 +313,7 @@ public class TreeMap extends AbstractMap
|
|||
*
|
||||
* @return the map's comparator
|
||||
*/
|
||||
public Comparator comparator()
|
||||
public Comparator<? super K> comparator()
|
||||
{
|
||||
return comparator;
|
||||
}
|
||||
|
@ -329,7 +329,7 @@ public class TreeMap extends AbstractMap
|
|||
*/
|
||||
public boolean containsKey(Object key)
|
||||
{
|
||||
return getNode(key) != nil;
|
||||
return getNode((K) key) != nil;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -364,19 +364,19 @@ public class TreeMap extends AbstractMap
|
|||
* @see #values()
|
||||
* @see Map.Entry
|
||||
*/
|
||||
public Set entrySet()
|
||||
public Set<Map.Entry<K,V>> entrySet()
|
||||
{
|
||||
if (entries == null)
|
||||
// Create an AbstractSet with custom implementations of those methods
|
||||
// that can be overriden easily and efficiently.
|
||||
entries = new AbstractSet()
|
||||
entries = new AbstractSet<Map.Entry<K,V>>()
|
||||
{
|
||||
public int size()
|
||||
{
|
||||
return size;
|
||||
}
|
||||
|
||||
public Iterator iterator()
|
||||
public Iterator<Map.Entry<K,V>> iterator()
|
||||
{
|
||||
return new TreeIterator(ENTRIES);
|
||||
}
|
||||
|
@ -390,8 +390,8 @@ public class TreeMap extends AbstractMap
|
|||
{
|
||||
if (! (o instanceof Map.Entry))
|
||||
return false;
|
||||
Map.Entry me = (Map.Entry) o;
|
||||
Node n = getNode(me.getKey());
|
||||
Map.Entry<K,V> me = (Map.Entry<K,V>) o;
|
||||
Node<K,V> n = getNode(me.getKey());
|
||||
return n != nil && AbstractSet.equals(me.getValue(), n.value);
|
||||
}
|
||||
|
||||
|
@ -399,8 +399,8 @@ public class TreeMap extends AbstractMap
|
|||
{
|
||||
if (! (o instanceof Map.Entry))
|
||||
return false;
|
||||
Map.Entry me = (Map.Entry) o;
|
||||
Node n = getNode(me.getKey());
|
||||
Map.Entry<K,V> me = (Map.Entry<K,V>) o;
|
||||
Node<K,V> n = getNode(me.getKey());
|
||||
if (n != nil && AbstractSet.equals(me.getValue(), n.value))
|
||||
{
|
||||
removeNode(n);
|
||||
|
@ -418,7 +418,7 @@ public class TreeMap extends AbstractMap
|
|||
* @return the first key
|
||||
* @throws NoSuchElementException if the map is empty
|
||||
*/
|
||||
public Object firstKey()
|
||||
public K firstKey()
|
||||
{
|
||||
if (root == nil)
|
||||
throw new NoSuchElementException();
|
||||
|
@ -439,10 +439,10 @@ public class TreeMap extends AbstractMap
|
|||
* @see #put(Object, Object)
|
||||
* @see #containsKey(Object)
|
||||
*/
|
||||
public Object get(Object key)
|
||||
public V get(Object key)
|
||||
{
|
||||
// Exploit fact that nil.value == null.
|
||||
return getNode(key).value;
|
||||
return getNode((K) key).value;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -460,9 +460,9 @@ public class TreeMap extends AbstractMap
|
|||
* @throws NullPointerException if toKey is null, but the comparator does not
|
||||
* tolerate null elements
|
||||
*/
|
||||
public SortedMap headMap(Object toKey)
|
||||
public SortedMap<K, V> headMap(K toKey)
|
||||
{
|
||||
return new SubMap(nil, toKey);
|
||||
return new SubMap((K)(Object)nil, toKey);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -474,19 +474,19 @@ public class TreeMap extends AbstractMap
|
|||
* @see #values()
|
||||
* @see #entrySet()
|
||||
*/
|
||||
public Set keySet()
|
||||
public Set<K> keySet()
|
||||
{
|
||||
if (keys == null)
|
||||
// Create an AbstractSet with custom implementations of those methods
|
||||
// that can be overriden easily and efficiently.
|
||||
keys = new AbstractSet()
|
||||
keys = new AbstractSet<K>()
|
||||
{
|
||||
public int size()
|
||||
{
|
||||
return size;
|
||||
}
|
||||
|
||||
public Iterator iterator()
|
||||
public Iterator<K> iterator()
|
||||
{
|
||||
return new TreeIterator(KEYS);
|
||||
}
|
||||
|
@ -503,7 +503,7 @@ public class TreeMap extends AbstractMap
|
|||
|
||||
public boolean remove(Object key)
|
||||
{
|
||||
Node n = getNode(key);
|
||||
Node<K,V> n = getNode((K) key);
|
||||
if (n == nil)
|
||||
return false;
|
||||
removeNode(n);
|
||||
|
@ -519,7 +519,7 @@ public class TreeMap extends AbstractMap
|
|||
* @return the last key
|
||||
* @throws NoSuchElementException if the map is empty
|
||||
*/
|
||||
public Object lastKey()
|
||||
public K lastKey()
|
||||
{
|
||||
if (root == nil)
|
||||
throw new NoSuchElementException("empty");
|
||||
|
@ -542,10 +542,10 @@ public class TreeMap extends AbstractMap
|
|||
* @see #get(Object)
|
||||
* @see Object#equals(Object)
|
||||
*/
|
||||
public Object put(Object key, Object value)
|
||||
public V put(K key, V value)
|
||||
{
|
||||
Node current = root;
|
||||
Node parent = nil;
|
||||
Node<K,V> current = root;
|
||||
Node<K,V> parent = nil;
|
||||
int comparison = 0;
|
||||
|
||||
// Find new node's parent.
|
||||
|
@ -595,13 +595,13 @@ public class TreeMap extends AbstractMap
|
|||
* @throws NullPointerException if a key in m is null, and the comparator
|
||||
* does not tolerate nulls
|
||||
*/
|
||||
public void putAll(Map m)
|
||||
public void putAll(Map<? extends K, ? extends V> m)
|
||||
{
|
||||
Iterator itr = m.entrySet().iterator();
|
||||
int pos = m.size();
|
||||
while (--pos >= 0)
|
||||
{
|
||||
Map.Entry e = (Map.Entry) itr.next();
|
||||
Map.Entry<K,V> e = (Map.Entry<K,V>) itr.next();
|
||||
put(e.getKey(), e.getValue());
|
||||
}
|
||||
}
|
||||
|
@ -619,13 +619,13 @@ public class TreeMap extends AbstractMap
|
|||
* @throws NullPointerException if key is null, but the comparator does
|
||||
* not tolerate nulls
|
||||
*/
|
||||
public Object remove(Object key)
|
||||
public V remove(Object key)
|
||||
{
|
||||
Node n = getNode(key);
|
||||
Node<K, V> n = getNode((K)key);
|
||||
if (n == nil)
|
||||
return null;
|
||||
// Note: removeNode can alter the contents of n, so save value now.
|
||||
Object result = n.value;
|
||||
V result = n.value;
|
||||
removeNode(n);
|
||||
return result;
|
||||
}
|
||||
|
@ -659,7 +659,7 @@ public class TreeMap extends AbstractMap
|
|||
* comparator does not tolerate null elements
|
||||
* @throws IllegalArgumentException if fromKey is greater than toKey
|
||||
*/
|
||||
public SortedMap subMap(Object fromKey, Object toKey)
|
||||
public SortedMap<K, V> subMap(K fromKey, K toKey)
|
||||
{
|
||||
return new SubMap(fromKey, toKey);
|
||||
}
|
||||
|
@ -679,9 +679,9 @@ public class TreeMap extends AbstractMap
|
|||
* @throws NullPointerException if fromKey is null, but the comparator
|
||||
* does not tolerate null elements
|
||||
*/
|
||||
public SortedMap tailMap(Object fromKey)
|
||||
public SortedMap<K, V> tailMap(K fromKey)
|
||||
{
|
||||
return new SubMap(fromKey, nil);
|
||||
return new SubMap(fromKey, (K)(Object)nil);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -694,19 +694,19 @@ public class TreeMap extends AbstractMap
|
|||
* @see #keySet()
|
||||
* @see #entrySet()
|
||||
*/
|
||||
public Collection values()
|
||||
public Collection<V> values()
|
||||
{
|
||||
if (values == null)
|
||||
// We don't bother overriding many of the optional methods, as doing so
|
||||
// wouldn't provide any significant performance advantage.
|
||||
values = new AbstractCollection()
|
||||
values = new AbstractCollection<V>()
|
||||
{
|
||||
public int size()
|
||||
{
|
||||
return size;
|
||||
}
|
||||
|
||||
public Iterator iterator()
|
||||
public Iterator<V> iterator()
|
||||
{
|
||||
return new TreeIterator(VALUES);
|
||||
}
|
||||
|
@ -729,7 +729,7 @@ public class TreeMap extends AbstractMap
|
|||
* or are not Comparable with natural ordering
|
||||
* @throws NullPointerException if o1 or o2 is null with natural ordering
|
||||
*/
|
||||
final int compare(Object o1, Object o2)
|
||||
final int compare(K o1, K o2)
|
||||
{
|
||||
return (comparator == null
|
||||
? ((Comparable) o1).compareTo(o2)
|
||||
|
@ -742,7 +742,7 @@ public class TreeMap extends AbstractMap
|
|||
* @param node the child of the node just deleted, possibly nil
|
||||
* @param parent the parent of the node just deleted, never nil
|
||||
*/
|
||||
private void deleteFixup(Node node, Node parent)
|
||||
private void deleteFixup(Node<K,V> node, Node<K,V> parent)
|
||||
{
|
||||
// if (parent == nil)
|
||||
// throw new InternalError();
|
||||
|
@ -754,7 +754,7 @@ public class TreeMap extends AbstractMap
|
|||
if (node == parent.left)
|
||||
{
|
||||
// Rebalance left side.
|
||||
Node sibling = parent.right;
|
||||
Node<K,V> sibling = parent.right;
|
||||
// if (sibling == nil)
|
||||
// throw new InternalError();
|
||||
if (sibling.color == RED)
|
||||
|
@ -798,7 +798,7 @@ public class TreeMap extends AbstractMap
|
|||
else
|
||||
{
|
||||
// Symmetric "mirror" of left-side case.
|
||||
Node sibling = parent.left;
|
||||
Node<K,V> sibling = parent.left;
|
||||
// if (sibling == nil)
|
||||
// throw new InternalError();
|
||||
if (sibling.color == RED)
|
||||
|
@ -931,7 +931,7 @@ public class TreeMap extends AbstractMap
|
|||
*
|
||||
* @return the first node
|
||||
*/
|
||||
final Node firstNode()
|
||||
final Node<K, V> firstNode()
|
||||
{
|
||||
// Exploit fact that nil.left == nil.
|
||||
Node node = root;
|
||||
|
@ -947,9 +947,9 @@ public class TreeMap extends AbstractMap
|
|||
* @param key the key to search for
|
||||
* @return the node where the key is found, or nil
|
||||
*/
|
||||
final Node getNode(Object key)
|
||||
final Node<K, V> getNode(K key)
|
||||
{
|
||||
Node current = root;
|
||||
Node<K,V> current = root;
|
||||
while (current != nil)
|
||||
{
|
||||
int comparison = compare(key, current.key);
|
||||
|
@ -970,13 +970,13 @@ public class TreeMap extends AbstractMap
|
|||
* @param key the upper bound, exclusive
|
||||
* @return the previous node
|
||||
*/
|
||||
final Node highestLessThan(Object key)
|
||||
final Node<K,V> highestLessThan(K key)
|
||||
{
|
||||
if (key == nil)
|
||||
return lastNode();
|
||||
|
||||
Node last = nil;
|
||||
Node current = root;
|
||||
Node<K,V> last = nil;
|
||||
Node<K,V> current = root;
|
||||
int comparison = 0;
|
||||
|
||||
while (current != nil)
|
||||
|
@ -998,7 +998,7 @@ public class TreeMap extends AbstractMap
|
|||
*
|
||||
* @param n the newly inserted node
|
||||
*/
|
||||
private void insertFixup(Node n)
|
||||
private void insertFixup(Node<K,V> n)
|
||||
{
|
||||
// Only need to rebalance when parent is a RED node, and while at least
|
||||
// 2 levels deep into the tree (ie: node has a grandparent). Remember
|
||||
|
@ -1073,7 +1073,7 @@ public class TreeMap extends AbstractMap
|
|||
*
|
||||
* @return the last node
|
||||
*/
|
||||
private Node lastNode()
|
||||
private Node<K,V> lastNode()
|
||||
{
|
||||
// Exploit fact that nil.right == nil.
|
||||
Node node = root;
|
||||
|
@ -1091,13 +1091,13 @@ public class TreeMap extends AbstractMap
|
|||
* @param first true to return the first element instead of nil for nil key
|
||||
* @return the next node
|
||||
*/
|
||||
final Node lowestGreaterThan(Object key, boolean first)
|
||||
final Node<K,V> lowestGreaterThan(K key, boolean first)
|
||||
{
|
||||
if (key == nil)
|
||||
return first ? firstNode() : nil;
|
||||
|
||||
Node last = nil;
|
||||
Node current = root;
|
||||
Node<K,V> last = nil;
|
||||
Node<K,V> current = root;
|
||||
int comparison = 0;
|
||||
|
||||
while (current != nil)
|
||||
|
@ -1120,7 +1120,7 @@ public class TreeMap extends AbstractMap
|
|||
* @param node the current node, not nil
|
||||
* @return the prior node in sorted order
|
||||
*/
|
||||
private Node predecessor(Node node)
|
||||
private Node<K,V> predecessor(Node<K,V> node)
|
||||
{
|
||||
if (node.left != nil)
|
||||
{
|
||||
|
@ -1169,21 +1169,21 @@ public class TreeMap extends AbstractMap
|
|||
|
||||
/**
|
||||
* Construct a tree from sorted keys in linear time, with values of "".
|
||||
* Package visible for use by TreeSet.
|
||||
* Package visible for use by TreeSet, which uses a value type of String.
|
||||
*
|
||||
* @param keys the iterator over the sorted keys
|
||||
* @param count the number of nodes to insert
|
||||
* @see TreeSet#TreeSet(SortedSet)
|
||||
*/
|
||||
final void putKeysLinear(Iterator keys, int count)
|
||||
final void putKeysLinear(Iterator<K> keys, int count)
|
||||
{
|
||||
fabricateTree(count);
|
||||
Node node = firstNode();
|
||||
Node<K,V> node = firstNode();
|
||||
|
||||
while (--count >= 0)
|
||||
{
|
||||
node.key = keys.next();
|
||||
node.value = "";
|
||||
node.value = (V) "";
|
||||
node = successor(node);
|
||||
}
|
||||
}
|
||||
|
@ -1211,10 +1211,10 @@ public class TreeMap extends AbstractMap
|
|||
*
|
||||
* @param node the node to remove
|
||||
*/
|
||||
final void removeNode(Node node)
|
||||
final void removeNode(Node<K,V> node)
|
||||
{
|
||||
Node splice;
|
||||
Node child;
|
||||
Node<K,V> splice;
|
||||
Node<K,V> child;
|
||||
|
||||
modCount++;
|
||||
size--;
|
||||
|
@ -1268,7 +1268,7 @@ public class TreeMap extends AbstractMap
|
|||
*
|
||||
* @param node the node to rotate
|
||||
*/
|
||||
private void rotateLeft(Node node)
|
||||
private void rotateLeft(Node<K,V> node)
|
||||
{
|
||||
Node child = node.right;
|
||||
// if (node == nil || child == nil)
|
||||
|
@ -1301,7 +1301,7 @@ public class TreeMap extends AbstractMap
|
|||
*
|
||||
* @param node the node to rotate
|
||||
*/
|
||||
private void rotateRight(Node node)
|
||||
private void rotateRight(Node<K,V> node)
|
||||
{
|
||||
Node child = node.left;
|
||||
// if (node == nil || child == nil)
|
||||
|
@ -1336,7 +1336,7 @@ public class TreeMap extends AbstractMap
|
|||
* @param node the current node, not nil
|
||||
* @return the next node in sorted order
|
||||
*/
|
||||
final Node successor(Node node)
|
||||
final Node<K,V> successor(Node<K,V> node)
|
||||
{
|
||||
if (node.right != nil)
|
||||
{
|
||||
|
@ -1346,7 +1346,7 @@ public class TreeMap extends AbstractMap
|
|||
return node;
|
||||
}
|
||||
|
||||
Node parent = node.parent;
|
||||
Node<K,V> parent = node.parent;
|
||||
// Exploit fact that nil.right == nil and node is non-nil.
|
||||
while (node == parent.right)
|
||||
{
|
||||
|
@ -1489,24 +1489,26 @@ public class TreeMap extends AbstractMap
|
|||
*
|
||||
* @author Eric Blake (ebb9@email.byu.edu)
|
||||
*/
|
||||
private final class SubMap extends AbstractMap implements SortedMap
|
||||
private final class SubMap<SK extends K,SV extends V>
|
||||
extends AbstractMap<SK,SV>
|
||||
implements SortedMap<SK,SV>
|
||||
{
|
||||
/**
|
||||
* The lower range of this view, inclusive, or nil for unbounded.
|
||||
* Package visible for use by nested classes.
|
||||
*/
|
||||
final Object minKey;
|
||||
final SK minKey;
|
||||
|
||||
/**
|
||||
* The upper range of this view, exclusive, or nil for unbounded.
|
||||
* Package visible for use by nested classes.
|
||||
*/
|
||||
final Object maxKey;
|
||||
final SK maxKey;
|
||||
|
||||
/**
|
||||
* The cache for {@link #entrySet()}.
|
||||
*/
|
||||
private Set entries;
|
||||
private Set<Map.Entry<SK,SV>> entries;
|
||||
|
||||
/**
|
||||
* Create a SubMap representing the elements between minKey (inclusive)
|
||||
|
@ -1517,9 +1519,9 @@ public class TreeMap extends AbstractMap
|
|||
* @param maxKey the upper bound
|
||||
* @throws IllegalArgumentException if minKey > maxKey
|
||||
*/
|
||||
SubMap(Object minKey, Object maxKey)
|
||||
SubMap(SK minKey, SK maxKey)
|
||||
{
|
||||
if (minKey != nil && maxKey != nil && compare(minKey, maxKey) > 0)
|
||||
if (minKey != nil && maxKey != nil && compare((K) minKey, (K) maxKey) > 0)
|
||||
throw new IllegalArgumentException("fromKey > toKey");
|
||||
this.minKey = minKey;
|
||||
this.maxKey = maxKey;
|
||||
|
@ -1533,10 +1535,10 @@ public class TreeMap extends AbstractMap
|
|||
* @param key the key to check
|
||||
* @return true if the key is in range
|
||||
*/
|
||||
boolean keyInRange(Object key)
|
||||
boolean keyInRange(SK key)
|
||||
{
|
||||
return ((minKey == nil || compare(key, minKey) >= 0)
|
||||
&& (maxKey == nil || compare(key, maxKey) < 0));
|
||||
return ((minKey == nil || compare((K) key, (K) minKey) >= 0)
|
||||
&& (maxKey == nil || compare((K) key, (K) maxKey) < 0));
|
||||
}
|
||||
|
||||
public void clear()
|
||||
|
@ -1551,14 +1553,14 @@ public class TreeMap extends AbstractMap
|
|||
}
|
||||
}
|
||||
|
||||
public Comparator comparator()
|
||||
public Comparator<? super SK> comparator()
|
||||
{
|
||||
return comparator;
|
||||
}
|
||||
|
||||
public boolean containsKey(Object key)
|
||||
{
|
||||
return keyInRange(key) && TreeMap.this.containsKey(key);
|
||||
return keyInRange((SK) key) && TreeMap.this.containsKey(key);
|
||||
}
|
||||
|
||||
public boolean containsValue(Object value)
|
||||
|
@ -1574,19 +1576,19 @@ public class TreeMap extends AbstractMap
|
|||
return false;
|
||||
}
|
||||
|
||||
public Set entrySet()
|
||||
public Set<Map.Entry<SK,SV>> entrySet()
|
||||
{
|
||||
if (entries == null)
|
||||
// Create an AbstractSet with custom implementations of those methods
|
||||
// that can be overriden easily and efficiently.
|
||||
entries = new AbstractSet()
|
||||
entries = new AbstractSet<Map.Entry<SK,SV>>()
|
||||
{
|
||||
public int size()
|
||||
{
|
||||
return SubMap.this.size();
|
||||
}
|
||||
|
||||
public Iterator iterator()
|
||||
public Iterator<Map.Entry<SK,SV>> iterator()
|
||||
{
|
||||
Node first = lowestGreaterThan(minKey, true);
|
||||
Node max = lowestGreaterThan(maxKey, false);
|
||||
|
@ -1602,11 +1604,11 @@ public class TreeMap extends AbstractMap
|
|||
{
|
||||
if (! (o instanceof Map.Entry))
|
||||
return false;
|
||||
Map.Entry me = (Map.Entry) o;
|
||||
Object key = me.getKey();
|
||||
Map.Entry<SK,SV> me = (Map.Entry<SK,SV>) o;
|
||||
SK key = me.getKey();
|
||||
if (! keyInRange(key))
|
||||
return false;
|
||||
Node n = getNode(key);
|
||||
Node<K,V> n = getNode((K) key);
|
||||
return n != nil && AbstractSet.equals(me.getValue(), n.value);
|
||||
}
|
||||
|
||||
|
@ -1614,11 +1616,11 @@ public class TreeMap extends AbstractMap
|
|||
{
|
||||
if (! (o instanceof Map.Entry))
|
||||
return false;
|
||||
Map.Entry me = (Map.Entry) o;
|
||||
Object key = me.getKey();
|
||||
Map.Entry<SK,SV> me = (Map.Entry<SK,SV>) o;
|
||||
SK key = me.getKey();
|
||||
if (! keyInRange(key))
|
||||
return false;
|
||||
Node n = getNode(key);
|
||||
Node<K,V> n = getNode((K) key);
|
||||
if (n != nil && AbstractSet.equals(me.getValue(), n.value))
|
||||
{
|
||||
removeNode(n);
|
||||
|
@ -1630,29 +1632,29 @@ public class TreeMap extends AbstractMap
|
|||
return entries;
|
||||
}
|
||||
|
||||
public Object firstKey()
|
||||
public SK firstKey()
|
||||
{
|
||||
Node node = lowestGreaterThan(minKey, true);
|
||||
Node<SK,SV> node = (Node<SK,SV>) lowestGreaterThan(minKey, true);
|
||||
if (node == nil || ! keyInRange(node.key))
|
||||
throw new NoSuchElementException();
|
||||
return node.key;
|
||||
}
|
||||
|
||||
public Object get(Object key)
|
||||
public SV get(Object key)
|
||||
{
|
||||
if (keyInRange(key))
|
||||
return TreeMap.this.get(key);
|
||||
if (keyInRange((SK) key))
|
||||
return (SV) TreeMap.this.get(key);
|
||||
return null;
|
||||
}
|
||||
|
||||
public SortedMap headMap(Object toKey)
|
||||
public SortedMap<SK,SV> headMap(SK toKey)
|
||||
{
|
||||
if (! keyInRange(toKey))
|
||||
throw new IllegalArgumentException("key outside range");
|
||||
return new SubMap(minKey, toKey);
|
||||
}
|
||||
|
||||
public Set keySet()
|
||||
public Set<SK> keySet()
|
||||
{
|
||||
if (this.keys == null)
|
||||
// Create an AbstractSet with custom implementations of those methods
|
||||
|
@ -1664,7 +1666,7 @@ public class TreeMap extends AbstractMap
|
|||
return SubMap.this.size();
|
||||
}
|
||||
|
||||
public Iterator iterator()
|
||||
public Iterator<SK> iterator()
|
||||
{
|
||||
Node first = lowestGreaterThan(minKey, true);
|
||||
Node max = lowestGreaterThan(maxKey, false);
|
||||
|
@ -1678,16 +1680,16 @@ public class TreeMap extends AbstractMap
|
|||
|
||||
public boolean contains(Object o)
|
||||
{
|
||||
if (! keyInRange(o))
|
||||
if (! keyInRange((SK) o))
|
||||
return false;
|
||||
return getNode(o) != nil;
|
||||
return getNode((K) o) != nil;
|
||||
}
|
||||
|
||||
public boolean remove(Object o)
|
||||
{
|
||||
if (! keyInRange(o))
|
||||
if (! keyInRange((SK) o))
|
||||
return false;
|
||||
Node n = getNode(o);
|
||||
Node n = getNode((K) o);
|
||||
if (n != nil)
|
||||
{
|
||||
removeNode(n);
|
||||
|
@ -1699,25 +1701,25 @@ public class TreeMap extends AbstractMap
|
|||
return this.keys;
|
||||
}
|
||||
|
||||
public Object lastKey()
|
||||
public SK lastKey()
|
||||
{
|
||||
Node node = highestLessThan(maxKey);
|
||||
Node<SK,SV> node = (Node<SK,SV>) highestLessThan(maxKey);
|
||||
if (node == nil || ! keyInRange(node.key))
|
||||
throw new NoSuchElementException();
|
||||
return node.key;
|
||||
return (SK) node.key;
|
||||
}
|
||||
|
||||
public Object put(Object key, Object value)
|
||||
public SV put(SK key, SV value)
|
||||
{
|
||||
if (! keyInRange(key))
|
||||
throw new IllegalArgumentException("Key outside range");
|
||||
return TreeMap.this.put(key, value);
|
||||
return (SV) TreeMap.this.put(key, value);
|
||||
}
|
||||
|
||||
public Object remove(Object key)
|
||||
public SV remove(Object key)
|
||||
{
|
||||
if (keyInRange(key))
|
||||
return TreeMap.this.remove(key);
|
||||
if (keyInRange((SK)key))
|
||||
return (SV) TreeMap.this.remove(key);
|
||||
return null;
|
||||
}
|
||||
|
||||
|
@ -1734,21 +1736,21 @@ public class TreeMap extends AbstractMap
|
|||
return count;
|
||||
}
|
||||
|
||||
public SortedMap subMap(Object fromKey, Object toKey)
|
||||
public SortedMap<SK, SV> subMap(SK fromKey, SK toKey)
|
||||
{
|
||||
if (! keyInRange(fromKey) || ! keyInRange(toKey))
|
||||
throw new IllegalArgumentException("key outside range");
|
||||
return new SubMap(fromKey, toKey);
|
||||
}
|
||||
|
||||
public SortedMap tailMap(Object fromKey)
|
||||
public SortedMap<SK, SV> tailMap(SK fromKey)
|
||||
{
|
||||
if (! keyInRange(fromKey))
|
||||
throw new IllegalArgumentException("key outside range");
|
||||
return new SubMap(fromKey, maxKey);
|
||||
}
|
||||
|
||||
public Collection values()
|
||||
public Collection<SV> values()
|
||||
{
|
||||
if (this.values == null)
|
||||
// Create an AbstractCollection with custom implementations of those
|
||||
|
@ -1760,7 +1762,7 @@ public class TreeMap extends AbstractMap
|
|||
return SubMap.this.size();
|
||||
}
|
||||
|
||||
public Iterator iterator()
|
||||
public Iterator<SV> iterator()
|
||||
{
|
||||
Node first = lowestGreaterThan(minKey, true);
|
||||
Node max = lowestGreaterThan(maxKey, false);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue