05_符号表

05_符号表

  • 一、符号表
    • 符号表API设计
    • 符号表实现
    • 有序符号表

一、符号表

符号表最主要的目的就是将一个键和一个值联系起来,符号表能够将存储的数据元素是一个键和一个值共同组成的键值对数据,我们可以根据键来查找对应的值。

符号表中,键具有唯一性。
符号表在实际生活中的使用场景是非常广泛的,见下表:

应用查找目的
字典找出单词的释义单词释义
图书索引找出某个术语相关的页码术语一串页码
网络搜索找出某个关键字对应的网页关键字网页名称

符号表API设计

结点类:

类名Node<Key,Value>
构造方法Node(Key key,Value value,Node next):创建Node对象


成员变量

1. public Key key:存储键
2. public Value value:存储值
3. public Node next:存储下一个结点

符号表:

类名SymbolTable<Key,Value>
构造方法SymbolTable():创建SymbolTable对象


成员方法

1. public Value get(Key key):根据键key,找对应的值
2. public void put(Key key,Value val):向符号表中插入一个键值对
3. public void delete(Key key):删除键为key的键值对
4. public int size():获取符号表的大小
成员变量
1. private Node head:记录首结点
2. private int N:记录符号表中键值对的个数

符号表实现

//符号表
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){//先从符号表中查找键为key的键值对Node n = head;while(n.next!=null){n = n.next;if (n.key.equals(key)){n.value=value;return;}}//符号表中没有键为key的键值对Node oldFirst = head.next;Node newFirst = new Node(key,value,oldFirst);head.next = newFirst;//个数+1N++;}//删除符号表中键为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;}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 class Test {public static void main(String[] args) throws Exception {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());}
}

有序符号表

刚才实现的符号表,我们可以称之为无序符号表,因为在插入的时候,并没有考虑键值对的顺序,而在实际生活中,有时候我们需要根据键的大小进行排序,插入数据时要考虑顺序,那么接下来我们就实现一下有序符号表。

//有序符号表
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;}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 class Test {public static void main(String[] args) throws Exception {OrderSymbolTable<Integer, String> bt = new OrderSymbolTable<>();bt.put(4, "二哈");bt.put(3, "张三");bt.put(1, "李四");bt.put(1, "aa");bt.put(5, "王五");}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/296683.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

学习stm32 模电数电需要学哪些?

学习stm32 模电数电需要学哪些&#xff1f; 在开始前我有一些资料&#xff0c;是我根据自己从业十年经验&#xff0c;熬夜搞了几个通宵&#xff0c;精心整理了一份「 stm32的资料从专业入门到高级教程工具包」&#xff0c;点个关注&#xff0c;全部无偿共享给大家&#xff01;&…

Spark Shell的简单使用

简介 Spark shell是一个特别适合快速开发Spark原型程序的工具&#xff0c;可以帮助我们熟悉Scala语言。即使你对Scala不熟悉&#xff0c;仍然可以使用这个工具。Spark shell使得用户可以和Spark集群交互&#xff0c;提交查询&#xff0c;这便于调试&#xff0c;也便于初学者使用…

Kafka集群架构服务端核心概念

目录 Kafka集群选举 controller选举机制 Leader partition选举 leader partition自平衡 partition故障恢复机制 follower故障 leader故障 HW一致性保障 HW同步过程 Epoch Kafka集群选举 1. 在多个broker中, 需要选举出一个broker, 担任controller. 由controller来管理…

C++笔试训练day_2

文章目录 选择题7. 编程题1.2. 选择题 &#xff08;6&#xff09;因为p2被const修饰所以p2不可以被改变&#xff0c;但是p2的指向可以被改变 &#xff08;7&#xff09;因为指针p3被const修饰&#xff0c;所以p3的指向不能被改变&#xff0c;但是*p3可以被改变 int main() {in…

代码随想录算法训练营 | day60 单调栈 84.柱状图中最大的矩形

刷题 84.柱状图中最大的矩形 题目链接 | 文章讲解 | 视频讲解 题目&#xff1a;给定 n 个非负整数&#xff0c;用来表示柱状图中各个柱子的高度。每个柱子彼此相邻&#xff0c;且宽度为 1 。 求在该柱状图中&#xff0c;能够勾勒出来的矩形的最大面积。 1 < heights.len…

python实现元旦多种炫酷高级倒计时_附源码【第19篇—python过元旦】

文章目录 &#x1f30d;python实现元旦倒计时 — 初级(控制台)⛅实现效果&#x1f30b;实现源码&#x1f31c;源码讲解 &#x1f30d;python实现元旦倒计时 — 中级(精美动态图)⛅实现效果&#x1f30b;实现源码&#x1f31c;源码讲解 &#x1f30d;python实现元旦倒计时 — 高…

2024苹果手机iOS管理软软件iMazing2.17永久免费版下载教程

iMazing2024是一款专业的苹果IOS设备管理器&#xff0c;强悍的性能远超苹果的iTunes&#xff0c;iMazing 能让广大果粉能已自己的方式管理苹果设备&#xff0c;无需iTunes即可畅快传输或者保存苹果设备中的音乐、消息、文件以及其他数据。 iMazing2Mac-最新绿色安装包下载如下&…

Settings中电池选项-Android13

Settings中电池选项-Android13 1、设置中界面2、电池计算2.1 充电时间计算2.1.1 BatteryUsageStats获取2.1.2 BatteryStatsImpl计算 2.2 电池剩余使用时间2.2.1 Estimate获取2.2.2 BatteryStatsImpl计算 3、电池信息来源日志 [电池]Android 9.0 电池未充电与充电字符串提示信息…

指针的含义

我们还取前面图片解释的道理&#xff1a; pa表示的意思就是这个地址&#xff0c;并不会显示出10这个数字 *pa就是指针&#xff0c;最后指向了a10&#xff0c;所以他最后程序输出是10 &pa这个含义就是取pa的地址&#xff0c;那么pa是一个虚拟的地址&#xff0c;只是简单的…

BP网络识别26个英文字母matlab

wx供重浩&#xff1a;创享日记 对话框发送&#xff1a;字母识别 获取完整源码源工程文件 一、 设计思想 字符识别在现代日常生活的应用越来越广泛&#xff0c;比如车辆牌照自动识别系统&#xff0c;手写识别系统&#xff0c;办公自动化等等。本文采用BP网络对26个英文字母进行…

CAD制图

CAD制图 二维到三维 文章目录 CAD制图前言一、CAD制图二、机械设计三、二维图纸四、三维图纸总结前言 CAD制图可以提高设计效率和准确性,并方便文档的存档和交流,是现代工程设计中不可或缺的一部分。 一、CAD制图 CAD(Computer-Aided Design)是利用计算机技术辅助进行设计…

KingbaseV8R6单实例定时全量备份步骤

此场景为单机数据库节点内部备份&#xff0c;方便部署和操作&#xff0c;但备份REPO与数据库实例处于同一个物理主机&#xff0c;冗余度较低。 前期准备 配置ksql免密登录(必须) 在Kingbase数据库运行维护中&#xff0c;经常用到ksql工具登录数据库&#xff0c;本地免密登录…