符号表最主要的目的就是将一个键和一个值联系起来,符号表能够将存储的数据元素是一个键和一个值共同组成的
键值对数据,我们可以根据键来查找对应的值
无序符号表
// 无序符号表
public class SymbolTable<Key, Value> {
//记录首结点
private Node head;
//记录符号表中元素的个数
private int N;
public SymbolTable() {
head = new Node(null, null, null);
N = 0;
}
//获取符号表中键值对的个数
public int size() {
return N;
}
//往符号表中插入键值对
public void put(Key key, Value 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, head.next);
head.next = newNode;
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;
}
public void print() {
Node n = head;
while (n.next != null) {
n = n.next;
System.out.println(n.key + ":" + n.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;
}
}
public static void main(String[] args) {
SymbolTable<Integer, String> st = new SymbolTable<>();
st.put(1, "张三");
st.put(3, "李四");
st.put(5, "王五");
System.out.println(st.size());
st.put(1, "老三");
System.out.println(st.get(1));
System.out.println(st.size());
st.delete(1);
System.out.println(st.size());
st.print();
}
}
有序符号表
// 有序符号表
public class OrderSymbolTable<Key extends Comparable<Key>, Value> {
//记录首结点
private Node head;
//记录符号表中元素的个数
private int N;
public OrderSymbolTable() {
head = new Node(null, null, null);
N = 0;
}
//获取符号表中键值对的个数
public int size() {
return N;
}
public void put(Key key, Value value) {
//记录当前结点
Node curr = head.next;
//记录上一个结点
Node pre = head;
//1.如果key大于当前结点的key,则一直寻找下一个结点
while (curr != null && key.compareTo(curr.key) > 0) {
pre = curr;
curr = curr.next;
}
//2.如果当前结点curr的key和将要插入的key一样,则替换
if (curr != null && curr.key.compareTo(key) == 0) {
curr.value = value;
return;
}
//3.没有找到相同的key,把新结点插入到curr之前
Node newNode = new Node(key, value, curr);
pre.next = newNode;
}
//删除符号表中键为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;
}
public void print() {
Node n = head;
while (n.next != null) {
n = n.next;
System.out.println(n.key + ":" + n.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;
}
}
public static void main(String[] args) {
OrderSymbolTable<Integer, String> bt = new OrderSymbolTable<>();
bt.put(4, "二哈");
bt.put(3, "张三");
bt.put(1, "李四");
bt.put(1, "aa");
bt.put(5, "王五");
bt.print();
}
}