符号表最主要的目的就是将一个键和一个值联系起来,符号表能够存储的数据元素是一个键和一个值共同组成的键值对数据,我们可以根据键来查找对应的值。在符号表中,其键具有唯一性。
符号表的API设计:
结点类:
符号表:
代码实现:
package com.yyy;
import java.util.Iterator;
public class SymbolTable<Key,Value> {
//首先定义一个结点类
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;
}
}
//记录首结点
private Node head;
//记录符号表中键值对的个数
private int N;
//创建SymbolTable对象,初始化
public SymbolTable(){
this.N=0;
this.head=new Node(null,null,null);
}
//根据键key,找对应的值
public Value get(Key key){
Node n =head;
while(n.next!=null){
if(n.next.key.equals(key)){
return n.next.value;
}else{
n=n.next;
}
}
return null;
}
//向符号表中插入一个键值对
public void put(Key key,Value value){
//键重复,替换值
Node n=head;
while(n.next!=null){
n=n.next;
if(key.equals(n.key)){
n.value=value;
return;
}
}
//键不重复
if(n.next!=null){
Node oldFirst = n.next;
Node newNode = new Node(key, value, null);
n.next=newNode;
newNode.next=oldFirst;
N++;
}else{
Node newNode = new Node(key, value, null);
n.next=newNode;
N++;
}
}
//删除键为Key的键值对
public void delete(Key key){
Node n = head;
while(n.next!=null){
//判断n结点的下一个结点的键是否为key,如果是,就删除该结点
if (n.next.key.equals(key)){
n.next = n.next.next;
N--;
return;
}
//变换n
n = n.next;
}
}
//获取符号表的大小
public int size(){
return N;
}
}
测试代码:
package test;
import com.yyy.SymbolTable;
public class SymbolTableTest {
public static void main(String[] args) {
SymbolTable <Object, Object> table = new SymbolTable <>();
table.put(1,"王二");
table.put(2,"张三");
table.put(3,"李四");
System.out.println("==========此时元素的个数为"+table.size());
table.delete(1);
System.out.println("==========此时元素的个数为"+table.size());
table.put(1,"王五");
System.out.println("==========元素1的值为"+table.get(1));
}
}