一.概述
符号表最主要的目的就是将一个键和一个值联系起来,符号表能够将存储的数据元素是一个键和一个值共同组成的键值对数据,我们可以根据键key来查找对应的值value。
在符号表中,根据键key来找值value,所以键key要有唯一性 。 (类似Map的key①无序②不可重复)
二.java实现
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 int size(){
return N;
}
public SymbolTable(){
this.head=new Node(null,null,null);
this.N=0;
}
public void put(Key key,Value value){ //添加键值对
//如果符号表中已经存在了该key ,那么找到该结点,覆盖value值
Node n=head; //记录每次遍历链表得到的结点
while(n.next!=null){//先遍历
n=n.next;//第一轮n.next才有值; 迭代n
if(n.key.equals(key)){ //判断n结点的键是否为key,
n.value=value; //如果是则覆盖n的值为value
return; //return结束整个put方法,break结束整个循环,continue结束本次循环
}
}
//遍历后没有运行return则继续向下运行;
//如果符号表中没有该key,则创建新的结点,保存要添加的键值对,把新节点插入到链表的头部(头插法)
Node newFirst=new Node(key,value,null);
Node oldFirst=head.next; //记录原首结点
head.next=newFirst; //让head指向新首结点
newFirst.next=oldFirst; //新首结点 指向 原首结点
N++;
}
public void delete(Key key) {
//找到键为key的结点,把结点删除
Node n = head; //记录当前遍历的结点
while (n.next != null) {
//每一轮 判断n的下一个结点的键是否为key
if (n.next.key.equals(key)) {
n.next = n.next.next; //n最初为null, n.next才有值;删掉中间的结点即n.next}
N--;
return;
}
//不满足if,继续运行
n = n.next; //迭代n
}
}
public Value get(Key key){
Node n=head;
while(n.next!=null){
n=n.next;//迭代n , 且第一轮n.next才有值
if(n.key.equals(key)){
return n.value;
}
}
return null;
}
public static void main(String[] args) {
SymbolTable<Integer, String> s=new SymbolTable<>();
s.put(001,"张三");
s.put(002,"李四");
s.delete(001);
System.out.println(s.get(2));
System.out.println(s.get(1));
System.out.println(s.size());
}
}
运行结果:
李四
null
1
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/89374.html