目录
基本概念
最主要的目的就是将一个键和一个值联系起来。
定义:符号表是一种存储键值对的数据结构,支持插入(put)和查找(get)操作,即给定建得到相应的值。
- 每个键只对应一个值
- 向符号表中插入键值对,如果已存在就会替换原有的值

符号表API设计
-
采用链表实现
-
结点类

-
符号表

代码实现
package cn.itcast.algorithm.symbol;
public class SymbolTable<key,value> {
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<Integer, String> 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++;
}

1136

被折叠的 条评论
为什么被折叠?



