基本概念
符号表最主要的目的就是将一个键和一个值联系起来。
定义:符号表是一种存储键值对的数据结构,支持插入(put)和查找(get)操作,即给定建得到相应的值。
- 每个键只对应一个值
- 向符号表中插入键值对,如果已存在就会替换原有的值
/**
* 有序数组符号表
* @author yuli
*
*/
public class SymbolTable<K extends Comparable<K>,V> {
private K[] keys;//键数组
private V[] values;//值数组
private int size;
public SymbolTable(int capacity) {
keys = (K[]) new Comparable[capacity];
values = (V[]) new Object[capacity];
}
/**
* 查找键为K的值
* @param k
* @return
*/
public V get(K k){
if(isEmpty()){
return null;
}
//在数组中找出值
int i = rank(k);
if(i < size && keys[i].compareTo(k) == 0){
return values[i];
}
return null;
}
/**
* 插入要给键值对
* @param k
* @param v
*/
public void put(K k,V v){
int i = rank(k);
//如果已经存在了键,就交换值
if(i < size && keys[i].compareTo(k)==0){
values[i] = v;
return;
}
//否则就把键值插入到最小于K的值之后
for(int j = size ;j>i ; j--){
keys[j] = keys[j - 1];
values[j] = values[j - 1];
}
keys[i] = k;
values[i] = v;
size ++;
}
public boolean isEmpty(){
return size == 0;
}
public int rank(K k){
int low = 0;//低位起始下标
int high = size-1;//高位下标,长度-1
//高低交叉之前都一直查询
while(low <= high){
int mid = low - (high - low) /2;//找到中位下标
int cmd = k.compareTo(keys[mid]);//获取数组中中位值与比较K的大小
//如果两个值相等,说明找到了
if(cmd == 0){
return mid;
//小于0说明比中位值小,从数组中中位置左侧搜索
}else if(cmd < 0){
high = mid - 1;
//和上面相反,从数组右侧搜索
}else if(cmd < 0){
low = mid + 1;
}
}
//否侧返回低位的值,这个值就是小于被查找值的数量
return low;
}
}