映射
映射就是存储(键,值)数据对的数据结构(Key,Value),根据键(Key)找值(Value),由链表实现LinkedMap有序,由二分搜索树实现的TreeMap有序,键自然排序,由哈希表实现的HashMap无序。
TreeMap实现
我们借助先前实现的二分搜索树实现TreeMap,大部分方法的代码几乎是一致的,只有少许的更改。
Map接口定义
package ifce;
public interface Map<K,V> {
//将键值对key-value加入映射,如果已存在则为修改;
public void put(K key,V value);
//删除指定key的键值对,并返回对应的值;
public V remove(K key);
//产看指定key对应的键值对是否存在;
public boolean contains(K key);
//获取指定key对应的值value;
public V get(K key);
//修改指定key处的值为新的value;
public void set(K key,V value);
public int size();
public boolean isEmpty();
//获取所有键的Set;
public Set<K> keySet();
//获取所有值的List;
public List<V> values();
//获取所有键值对的Set;
public Set<Entry<K,V>> entrySet();
public interface Entry<K,V> extends Comparable<Entry<K,V>>{
public K getKey();
public V getValue();
}
}
TreeMap代码功能实现
使用结点定义和属性定义
map中存储的是键值对,所以结点类需要定义K,V属性以及树的左右几点left,right;在TreeMap中我们需要一个根结点属性以及元素个数的属性size;分别实现其构造函数;对于新建的TreeMap来说根结点是空的,元素个数为0;
package tree;
import ifce.List;
import ifce.Map;
import ifce.Set;
import lianbiao.LinkedList;
import java.util.Iterator;
public class TreeMap<K extends Comparable<K>,V> implements Map<K,V>,Iterable<Map.Entry<K,V>> {
//定义二分搜索树的节点信息;
private class Node{
public K key;
public V value;
public Node left;
public Node right;
public Node(){
}
public Node(K key,V value){
this.key = key;
this.value = value;
}
}
private Node root;
private int size;
public TreeMap(){
root = null;
size = 0;
}
定义辅助函数
该辅助函数是通过key找到相应的结点,并将其返回。
//辅助函数,获取指定key所在的节点;
//以node为根的二分搜索树中,查找key所在的结点-递归。
private Node getNode(Node node,K key){
if(node == null){
return null<