目录
基本概念
符号表API设计
采用链表实现
结点类
符号表
代码实现
测试代码
结果
有序符号表
基本概念
最主要的目的就是将一个键和一个值联系起来。
定义:符号表是一种存储键值对的数据结构,支持插入(put)和查找(get)操作,即给定建得到相应的值。
每个键只对应一个值向符号表中插入键值对,如果已存在就会替换原有的值
符号表API设计
采用链表实现 结点类
符号表
代码实现
package cn.itcast.algorithm.symbol;
public class SymbolTable {
private Node head;
private int N;
public 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){
//如果符号表中存在健为key的键值对,则找到该结点替换value
Node n=head;
while(n.next!=null){
n=n.next;
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){
//找到健为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;
}
}
测试代码
package cn.itcast.algorithm.symbol;
public class SymbolTableTest {
public static void main(String[] args) {
SymbolTable S = new SymbolTable<>();
//put
S.put(1,"十号");
S.put(2,"九号");
S.put(3,"八号");
System.out.println("元素个数为:"+S.size());
S.put(2,"六号");
System.out.println("替换完毕后元素个数:"+S.size());
//get
System.out.println("替换完毕后,健2对应的值:"+S.get(2));
//delete
S.delete(2);
System.out.println("删除后元素个数:"+S.size());
}
}
结果
采用链表实现 结点类
符号表
package cn.itcast.algorithm.symbol; public class SymbolTable{ private Node head; private int N; public 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){ //如果符号表中存在健为key的键值对,则找到该结点替换value Node n=head; while(n.next!=null){ n=n.next; 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){ //找到健为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; } }
测试代码
package cn.itcast.algorithm.symbol;
public class SymbolTableTest {
public static void main(String[] args) {
SymbolTable S = new SymbolTable<>();
//put
S.put(1,"十号");
S.put(2,"九号");
S.put(3,"八号");
System.out.println("元素个数为:"+S.size());
S.put(2,"六号");
System.out.println("替换完毕后元素个数:"+S.size());
//get
System.out.println("替换完毕后,健2对应的值:"+S.get(2));
//delete
S.delete(2);
System.out.println("删除后元素个数:"+S.size());
}
}
结果
有序符号表
有序符号表的实现就是把符号表的put方法修改一下即可,插入按照符号表key的大小有顺序的放入
//有序
public void put(key key,value value){
Node curr=head.next;
Node pre=head;
while(curr!=null && key.compareTo(curr.key)>0){
pre=curr;
curr=curr.next;
}
//如果值一样就替换
if(curr!=null && key.compareTo(curr.key)==0){
curr.value=value;
return;
}
Node newNode = new Node(key, value, curr);
pre.next=newNode;
N++;
}
有序符号表的实现就是把符号表的put方法修改一下即可,插入按照符号表key的大小有顺序的放入



