符号表
符号表的目的:将一个键和一个值联系起来,并能通过键直接查找到对应的值。
定义:符号表是一种存储键值对的数据结构,支持插入(put)和查找(get)操作。
- 一个键只对应一个值,不允许有重复的键。
- 当插入的键和以往的键有冲突时,新值取代旧值。
put()方法的实现
public void put(Key key, Value value)
{
if(key == null) //防止插入空值
return;
int i = rank(key); //找到插入符号表的位置
//如果符号表已经放满,则扩大表的大小
if(size == keys.length)
{
resize(2*keys.length);
}
//如果已经存在,则交换值。避免重复值
if(i < size && keys[i].compareTo(key) == 0)
{
values[i] = value;
return;
}
//否则,将大于i的键序列往右移,空出i将键值对插入。
for(int j = size; j>i; j--)
{
keys[j] = keys[j-1];
values[j] = values[j-1];
}
keys[i] = key;
values[i] = value;
size++;
}
get()方法的实现
public Value get(Key key)
{
if(isEmpty() || key == null) //如果为空或键值不存在则返回null。
{
return null;
}
int i = rank(key); //找到键key对应的序列。
if ((i < size) && (keys[i].compareTo(key) == 0))
{
return values[i];
}
return null;
}
rank()方法对符号表排序
//对键值对进行排序
private int rank(Key key) {
int lo = 0;
int hi = size -1;
//二分查找
while (lo <= hi)
{
int mid = lo + (hi - lo)/2;
int cmd = key.compareTo(keys[mid]);
if(cmd == 0)
return mid;
else if(cmd < 0)
hi = mid - 1;
else
lo = mid + 1;
}
return lo;
}
符号表的实例
思路设计
建立符号表之后,使用IO流在文件中读取字符串并将其按空格分解成各个单词,再将各个单词存入到符号表中,如果在符号表中未查找到此单词,则将<单词,1>存入表中,如果已存在此单词,则将<单词,get(单词) + 1>存入表中。