符号表
符号表最主要的目的就是将一个键和一个值联系起来,符号表能够将存储的数据元素是一个键和一个值共同组成的 键值对数据,我们可以根据键来查找对应的值。
符号表中,键具有唯一性。
符号表在实际生活中的使用场景是非常广泛的,见下表:
应用
|
查找目的
|
键
|
值
|
字典
|
找出单词的释义
|
单词
|
释义
|
图书索引
|
找出某个术语相关的页码
|
术语
|
一串页码
|
网络搜索
|
找出某个关键字对应的网页
|
关键字
|
网页名称
|
代码实现:
public class SymbolTable<Key,Value> {
// 记录头节点
private Node head;
// 记录符号表元素的个数
private int N;
private class Node{
// 键
public Key key;
// 值
public Value value;
// 下一个结点
public Node next;
public Node(Key key,Value value,Node next){
this.key=key;
this.value=value;
this.next=next;
}
}
// 构造方法
public SymbolTable() {
this.head=new Node(null,null,null);
this.N=0;
}
// 返回符号表中元素的个数
public int size() {
return N;
}
// 向符号表中添加元素
public void put(Key key,Value value) {
Node n=head;
// 遍历符号表
while(n.next!=null) {
n=n.next;
// 如果键在链表中存在,则只需要改变key所对应值
if(n.key.equals(key)) {
n.value=value;
return;
}
}
// 如果不存在,则添加一个新结点(键值对)
Node newNode=new Node(key,value,null);
Node oldfirst=head.next;
head.next=newNode;
newNode.next=oldfirst;
N++;
}
//删除符号表中键为key的键值对
public void delete(Key key) {
Node n=head;
while(n.next!=null) {
if(n.next.key.equals(key)) {
n.next=n.next.next;
N--;
return;
}
n=n.next;
}
}
//从符号表中获取key对应的值
public Value get(Key key) {
Node n=head;
while(n.next!=null) {
n=n.next;
if(n.key.equals(key)) {
return n.value;
}
}
return null;
}
}