Map 在有些編程語言中也叫做字典(dictionary,比如 Python)
Map 中的每一個 Key 是唯一的
Map 中的每一個 Key 對應一個 Value
Map的接口定義(Map.java)
public interface Map < K, V> {
int size ( ) ;
boolean isEmpty ( ) ;
void clear ( ) ;
V put ( K key, V value) ;
V get ( K key) ;
V remove ( K key) ;
boolean containsKey ( K key) ;
boolean containsValue ( V value) ;
void traversal ( Visitor< K, V> visitor) ;
public static abstract class Visitor < K, V> {
boolean stop;
public abstract boolean visit ( K key, V value) ;
}
}
紅黑樹實現 TreeMap
public class TreeMap < K, V> implements Map < K, V> {
private static final boolean RED = false ;
private static final boolean BLACK = true ;
private int size;
private Node< K, V> root;
private Comparator< K> comparator;
public TreeMap ( ) {
this ( null) ;
}
public TreeMap ( Comparator< K> comparator) {
this . comparator = comparator;
}
private static class Node < K, V> {
K key;
V value;
boolean color = RED;
Node< K, V> left;
Node< K, V> right;
Node< K, V> parent;
public Node ( K key, V value, Node< K, V> parent) {
this . key = key;
this . value = value;
this . parent = parent;
}
public boolean isLeaf ( ) {
return left == null && right == null;
}
public boolean hasTwoChildren ( ) {
return left != null && right != null;
}
public boolean isLeftChild ( ) {
return parent != null && this == parent. left;
}
public boolean isRightChild ( ) {
return parent != null && this == parent. right;
}
public Node< K, V> sibling ( ) {
if ( isLeftChild ( ) ) {
return parent. right;
}
if ( isRightChild ( ) ) {
return parent. left;
}
return null;
}
}
public int size ( ) {
return size;
}
public boolean isEmpty ( ) {
return size == 0 ;
}
public void clear ( ) {
root = null;
size = 0 ;
}
public V put ( K key, V value) {
KeyNotNullCheck ( key) ;
if ( root == null) {
root = new Node < > ( key, value, null) ;
size++ ;
afterPut ( root) ;
return null;
}
Node< K, V> parent = root;
Node< K, V> node = root;
int cmp = 0 ;
do {
cmp = compare ( key, node. key) ;
parent = node;
if ( cmp > 0 ) {
node = node. right;
} else if ( cmp < 0 ) {
node = node. left;
} else {
node. key = key;
V oldValue = node. value;
node. value = value;
return oldValue;
}
} while ( node != null) ;
Node< K, V> newNode = new Node ( key, value, parent) ;
if ( cmp > 0 ) {
parent. right = newNode;
} else {
parent. left = newNode;
}
size++ ;
afterPut ( newNode) ;
return null;
}
public V get ( K key) {
Node< K, V> node = node ( key) ;
return node != null ? node. value : null;
}
public V remove ( K key) {
return remove ( node ( key) ) ;
}
private V remove ( Node< K, V> node) {
if ( node == null) return null;
Node< K, V> oldNode = node;
size-- ;
if ( node. hasTwoChildren ( ) ) {
Node< K, V> s = successor ( node) ;
node. key = s. key;
node. value = s. value;
node = s;
}
Node< K, V> replacement = node. left != null ? node. left : node. right;
if ( replacement != null) {
replacement. parent = node. parent;
if ( node. parent == null) {
root = replacement;
} else if ( node == node. parent. left) {
node. parent. left = replacement;
} else {
node. parent. right = replacement;
}
afterRemove ( replacement) ;
} else if ( node. parent == null) {
root = null;
afterRemove ( node) ;
} else {
if ( node == node. parent. left) {
node. parent. left = null;
} else {
node. parent. right = null;
}
afterRemove ( node) ;
}
return oldNode. value;
}
public boolean containsKey ( K key) {
return node ( key) != null;
}
public boolean containsValue ( V value) {
if ( root == null) return false ;
Queue< Node< K, V> > queue = new LinkedList < > ( ) ;
queue. offer ( root) ;
while ( ! queue. isEmpty ( ) ) {
Node< K, V> node = queue. poll ( ) ;
if ( valEquals ( value, node. value) ) return true ;
if ( node. left != null) {
queue. offer ( node. left) ;
}
if ( node. right != null) {
queue. offer ( node. right) ;
}
}
return false ;
}
public void traversal ( Visitor< K, V> visitor) {
if ( visitor == null) return ;
traversal ( root, visitor) ;
}
public void traversal ( Node< K, V> node, Visitor< K, V> visitor) {
if ( node == null || visitor. stop) return ;
traversal ( node. left, visitor) ;
if ( visitor. stop) return ;
visitor. visit ( node. key, node. value) ;
traversal ( node. right, visitor) ;
}
private boolean valEquals ( V v1, V v2) {
return v1 == null ? v2 == null : v1. equals ( v2) ;
}
protected Node< K, V> predecessor ( Node< K, V> node) {
if ( node == null) return null;
Node< K, V> p = node. left;
if ( p != null) {
while ( p. right != null) {
p = p. right;
}
return p;
}
while ( node. parent != null && node == node. parent. left) {
node = node. parent;
}
return node. parent;
}
protected Node< K, V> successor ( Node< K, V> node) {
if ( node == null) return null;
Node< K, V> p = node. right;
if ( p != null) {
while ( p. left != null) {
p = p. left;
}
return p;
}
while ( node. parent != null && node == node. parent. right) {
node = node. parent;
}
return node. parent;
}
private Node< K, V> node ( K key) {
Node< K, V> node = root;
while ( node != null) {
int cmp = compare ( key, node. key) ;
if ( cmp == 0 ) return node;
if ( cmp > 0 ) {
node = node. right;
} else {
node = node. left;
}
}
return null;
}
private void afterRemove ( Node< K, V> node) {
if ( isRed ( node) ) {
black ( node) ;
return ;
}
Node< K, V> parent = node. parent;
if ( parent == null) return ;
boolean left = parent. left == null || node. isLeftChild ( ) ;
Node< K, V> sibling = left ? parent. right : parent. left;
if ( left) {
if ( isRed ( sibling) ) {
black ( sibling) ;
red ( parent) ;
rotateLeft ( parent) ;
sibling = parent. right;
}
if ( isBlack ( sibling. left) && isBlack ( sibling. right) ) {
boolean parentBlack = isBlack ( parent) ;
black ( parent) ;
red ( sibling) ;
if ( parentBlack) {
afterRemove ( parent) ;
}
} else {
if ( isBlack ( sibling. right) ) {
rotateRight ( sibling) ;
sibling = parent. right;
}
color ( sibling, colorOf ( parent) ) ;
black ( sibling. right) ;
black ( parent) ;
rotateLeft ( parent) ;
}
} else {
if ( isRed ( sibling) ) {
black ( sibling) ;
red ( parent) ;
rotateRight ( parent) ;
sibling = parent. left;
}
if ( isBlack ( sibling. left) && isBlack ( sibling. right) ) {
boolean parentBlack = isBlack ( parent) ;
black ( parent) ;
red ( sibling) ;
if ( parentBlack) {
afterRemove ( parent) ;
}
} else {
if ( isBlack ( sibling. left) ) {
rotateLeft ( sibling) ;
sibling = parent. left;
}
color ( sibling, colorOf ( parent) ) ;
black ( sibling. left) ;
black ( parent) ;
rotateRight ( parent) ;
}
}
}
private void afterPut ( Node< K, V> node) {
Node< K, V> parent = node. parent;
if ( parent == null) {
black ( node) ;
return ;
}
if ( isBlack ( parent) ) return ;
Node< K, V> uncle = parent. sibling ( ) ;
Node< K, V> grand = red ( parent. parent) ;
if ( isRed ( uncle) ) {
black ( parent) ;
black ( uncle) ;
afterPut ( grand) ;
return ;
}
if ( parent. isLeftChild ( ) ) {
if ( node. isLeftChild ( ) ) {
black ( parent) ;
} else {
black ( node) ;
rotateLeft ( parent) ;
}
rotateRight ( grand) ;
} else {
if ( node. isLeftChild ( ) ) {
black ( node) ;
rotateRight ( parent) ;
} else {
black ( parent) ;
}
rotateLeft ( grand) ;
}
}
private void rotateLeft ( Node< K, V> grand) {
Node< K, V> parent = grand. right;
Node< K, V> child = parent. left;
grand. right = child;
parent. left = grand;
afterRotate ( grand, parent, child) ;
}
private void rotateRight ( Node< K, V> grand) {
Node< K, V> parent = grand. left;
Node< K, V> child = parent. right;
grand. left = child;
parent. right = grand;
afterRotate ( grand, parent, child) ;
}
private void afterRotate ( Node< K, V> grand, Node< K, V> parent, Node< K, V> child) {
parent. parent = grand. parent;
if ( grand. isLeftChild ( ) ) {
grand. parent. left = parent;
} else if ( grand. isRightChild ( ) ) {
grand. parent. right = parent;
} else {
root = parent;
}
if ( child != null) {
child. parent = grand;
}
grand. parent = parent;
}
private Node< K, V> color ( Node< K, V> node, boolean color) {
if ( node == null) return node;
node. color = color;
return node;
}
private Node< K, V> red ( Node< K, V> node) {
return color ( node, RED) ;
}
private Node< K, V> black ( Node< K, V> node) {
return color ( node, BLACK) ;
}
private boolean colorOf ( Node< K, V> node) {
return node == null ? BLACK : node. color;
}
private boolean isBlack ( Node< K, V> node) {
return colorOf ( node) == BLACK;
}
private boolean isRed ( Node< K, V> node) {
return colorOf ( node) == RED;
}
private int compare ( K k1, K k2) {
if ( comparator != null) {
return comparator. compare ( k1, k2) ;
}
return ( ( Comparable< K> ) k1) . compareTo ( k2) ;
}
private void KeyNotNullCheck ( K key) {
if ( key == null) {
throw new IllegalArgumentException ( "key must not be null" ) ;
}
}
}