java实现医院门诊排班与预约系统【代码】
文章目录
- 前言
- 一、遇到的问题
- 二、实现过程
- 1.数据库设计
- 2.实体类
- 3.医生添加排班或修改排班方法
- 4.患者预约方法
- 5.患者修改预约
- 6.患者取消预约
前言
该文章从实际需求出发,实现医生设置自身排班与患者预约功能。
一、遇到的问题
1、医生设置的排班表不能有时间上的冲突。
2、医生修改自己的排班时不能与数据库中的数据冲突。
3、如果多为患者同时预约需要使用redis做支撑解决并发问题。
二、实现过程
1.数据库设计
可根据实际需求添加或删除字段
排班数据库 rqri_guidance_time
| 字段名 | 字段类型 | 长度 | 注释 |
|---|---|---|---|
| guidance_time_id | int | 11 | 排班ID |
| date | date | 日期 | |
| starttime | time | 开始时间点 | |
| endtime | time | 结束时间点 | |
| num | int | 2 | 可预约次数 |
| residue | int | 2 | 剩余可预约次数 |
| doctor_id | int | 11 | 医生ID |
预约详情表 rqri_guidance_time_relation
| 字段名 | 字段类型 | 长度 | 注释 |
|---|---|---|---|
| reservation_id | int | 11 | 预约关系ID |
| guidance_time_id | int | 11 | 排班ID |
| patient_id | int | 11 | 患者ID |
| remarks | text | 病情描述 | |
| file_id | varchar | 256 | 附件ID |
| reservation_type | int | 11 | 预约类型ID |
| doctor_id | int | 11 | 医生ID |
| reply | text | 回复 | |
| reply_files_id | varchar | 256 | 回复附件ID |
| status | int | 1 | 状态ID |
| isfinish | int | 1 | 是否已完成咨询 |
| finish_time | datetime | 完成咨询的时间 | |
| create_time | datetime | 创建时间 |
2.实体类
@Table(name = "rqri_guidance_time")
@Data
public class RqriGuidanceTime implements Serializable {/*** 医生可预约时间id*/@Id@GeneratedValue(strategy = GenerationType.IDENTITY)@ApiModelProperty(value = "医生可预约时间id", required = false, dataType = "Integer")@Column(name = "guidance_time_id")private Integer guidanceTimeId;/*** 日期*/@ApiModelProperty(value = "日期", required = true, dataType = "Date")@Column(name = "date")@JsonFormat(locale="zh", timezone="GMT+8", pattern="yyyy-MM-dd")private Date date;/*** 开始时间点*/@ApiModelProperty(value = "开始时间点", required = true, dataType = "Date")@Column(name = "starttime")@JsonFormat(locale="zh", timezone="GMT+8", pattern="HH:mm")private Date starttime;/*** 结束时间点*/@ApiModelProperty(value = "结束时间点", required = true, dataType = "Date")@Column(name = "endtime")@JsonFormat(locale="zh", timezone="GMT+8", pattern="HH:mm")private Date endtime;/*** 可预约次数*/@ApiModelProperty(value = "可预约次数", required = true, dataType = "Integer")@Column(name = "num")private Integer num;/*** 剩余可预约次数*/@ApiModelProperty(value = "剩余可预约次数", required = true, dataType = "Integer")@Column(name = "residue")private Integer residue;/*** 医生id*/@ApiModelProperty(value = "医生id", required = true, dataType = "Integer")@Column(name = "doctor_id")private Integer doctorId;
@Table(name = "rqri_guidance_time_relation")
@Data
public class RqriGuidanceTimeRelation implements Serializable {/*** 预约关系id*/@Id@GeneratedValue(strategy = GenerationType.IDENTITY)@ApiModelProperty(value = "预约关系id", required = false, dataType = "Integer")@Column(name = "reservation_id")private Integer reservationId;/*** 预约时段id*/@ApiModelProperty(value = "预约时段id", required = true, dataType = "Integer")@Column(name = "guidance_time_id")private Integer guidanceTimeId;/*** 患者id*/@ApiModelProperty(value = "患者id", required = true, dataType = "Integer")@Column(name = "patient_id")private Integer patientId;/*** 描述*/@ApiModelProperty(value = "描述", required = false, dataType = "String")@Column(name = "remarks")private String remarks;/*** 附件id*/@ApiModelProperty(value = "附件id", required = false, dataType = "String")@Column(name = "file_id")private String fileId;/*** 预约类型*/@ApiModelProperty(value = "预约类型", required = true, dataType = "Integer")@Column(name = "reservation_type")private Integer reservationType;/*** 医生id*/@ApiModelProperty(value = "医生id", required = false, dataType = "Integer")@Column(name = "doctor_id")private Integer doctorId;/*** 回复*/@ApiModelProperty(value = "回复", required = false, dataType = "String")@Column(name = "reply")private String reply;/*** 回复附件*/@ApiModelProperty(value = "回复附件", required = false, dataType = "String")@Column(name = "reply_files_id")private String replyFilesId;/*** 状态*/@ApiModelProperty(value = "状态", required = false, dataType = "Integer")@Column(name = "work_status")private Integer workStatus;/*** 是否已完成咨询(1是,0否)*/@ApiModelProperty(value = "是否已完成咨询(1是,0否)", required = false, dataType = "Integer")@Column(name = "isfinish")private Integer isfinish;/*** 完成咨询的时间*/@ApiModelProperty(value = "完成咨询的时间", required = false, dataType = "Date")@Column(name = "finish_time")private Date finishTime;/*** 创建时间*/@ApiModelProperty(value = "创建时间", required = false, dataType = "Date")@Column(name = "create_time")private Date createTime;
3.医生添加排班或修改排班方法
public void addOrUpdateList(List<RqriGuidanceTime> list) {// 查询数据库中已有排班SimpleDateFormat simpleDateFormat1 = new SimpleDateFormat("HH:mm");SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");ArrayList<String> collect = new ArrayList<>();for (RqriGuidanceTime rqriGuidanceTime : list) {collect.add(simpleDateFormat.format(rqriGuidanceTime.getDate()));}List<String> list_date = collect.stream().distinct().collect(Collectors.toList());List<RqriGuidanceTime> rqriGuidanceTimes = rqriGuidanceTimeMapper.selectByDateList(list_date);// 已有的排班与修改的排班HashMap<String, List<RqriGuidanceTime>> hashMap_update = new HashMap<>();for (String item : list_date) {ArrayList<RqriGuidanceTime> list_update = new ArrayList<>();// 添加已有排班for (int j = 0; j < rqriGuidanceTimes.size(); j++) {if (simpleDateFormat.format(rqriGuidanceTimes.get(j).getDate()).equals(item)) {list_update.add(rqriGuidanceTimes.get(j));}}// 修改已有排班for (RqriGuidanceTime rqriGuidanceTime : list) {if (simpleDateFormat.format(rqriGuidanceTime.getDate()).equals(item) && rqriGuidanceTime.getGuidanceTimeId() != null) {for (int k = 0; k < list_update.size(); k++) {if (rqriGuidanceTime.getGuidanceTimeId().equals(list_update.get(k).getGuidanceTimeId())) {// 是否被预约if (!Objects.equals(list_update.get(k).getNum(), list_update.get(k).getResidue())) {String format = simpleDateFormat1.format(rqriGuidanceTime.getStarttime());String format1 = simpleDateFormat1.format(rqriGuidanceTime.getEndtime());throw new Exception("该时间点已被预约,不可修改!错误时间点:" + item + "," + format + "-" + format1);} else {list_update.set(k, rqriGuidanceTime);}}}}}hashMap_update.put(item, list_update);}// 新增的排班HashMap<String, List<RqriGuidanceTime>> hashMap_add = new HashMap<>();for (String value : list_date) {ArrayList<RqriGuidanceTime> list_add = new ArrayList<>();for (RqriGuidanceTime rqriGuidanceTime : list) {if (simpleDateFormat.format(rqriGuidanceTime.getDate()).equals(value) && rqriGuidanceTime.getGuidanceTimeId() == null) {list_add.add(rqriGuidanceTime);}}hashMap_add.put(value, list_add);}// 校验SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");for (String s : list_date) {List<Integer> list_standard = Arrays.asList(new Integer[2400]);for (int j = 0; j < 2400; j++) {list_standard.set(j, 1); // 1 表示可以选}// 已有的排班与修改的排班List<RqriGuidanceTime> rqriGuidanceTimes_update = hashMap_update.get(s);for (RqriGuidanceTime guidanceTime : rqriGuidanceTimes_update) {String starttime = sdf.format(guidanceTime.getStarttime());String endtime = sdf.format(guidanceTime.getEndtime());int start = Integer.parseInt(starttime.replace(":", ""));int end = Integer.parseInt(endtime.replace(":", ""));if (!(start < end)) {throw new Exception("时间设置错误,错误时间点:" + s + "," + starttime + "-" + endtime);}for (int k = start + 1; k < end; k++) {if (list_standard.get(k) == 0) {throw new Exception("该时间与其他时间点冲突,错误时间点:" + s + "," + starttime + "-" + endtime);} else {list_standard.set(k, 0);}}}// 新增的排班List<RqriGuidanceTime> rqriGuidanceTimes_add = hashMap_add.get(s);for (RqriGuidanceTime rqriGuidanceTime : rqriGuidanceTimes_add) {String starttime = sdf.format(rqriGuidanceTime.getStarttime());String endtime = sdf.format(rqriGuidanceTime.getEndtime());int start = Integer.parseInt(starttime.replace(":", ""));int end = Integer.parseInt(endtime.replace(":", ""));if (!(start < end)) {throw new Exception("时间设置错误,错误时间点:" + s + "," + starttime + "-" + endtime);}for (int k = start + 1; k < end; k++) {if (list_standard.get(k) == 0) {throw new Exception("该时间与其他时间点冲突,错误时间点:" + s + "," + starttime + "-" + endtime);} else {list_standard.set(k, 0);}}}}ArrayList<RqriGuidanceTime> list_update = new ArrayList<>();for (List<RqriGuidanceTime> update : hashMap_update.values()) {list_update.addAll(update);}for (RqriGuidanceTime rqriGuidanceTime : list_update) {rqriGuidanceTime.setResidue(rqriGuidanceTime.getNum());rqriGuidanceTimeMapper.updateByPrimaryKey(rqriGuidanceTime);//插入到redisresidueAddRedis(rqriGuidanceTime.getDate(), rqriGuidanceTime.getGuidanceTimeId().toString(), rqriGuidanceTime.getResidue());}ArrayList<RqriGuidanceTime> list_add = new ArrayList<>();for (List<RqriGuidanceTime> add : hashMap_add.values()) {list_add.addAll(add);}for (RqriGuidanceTime rqriGuidanceTime : list_add) {rqriGuidanceTime.setResidue(rqriGuidanceTime.getNum());}if (list_add.size() > 0) {rqriGuidanceTimeMapper.insertList(list_add);for (RqriGuidanceTime guidanceTime : list_add) {//插入到redisresidueAddRedis(guidanceTime.getDate(), guidanceTime.getGuidanceTimeId().toString(), guidanceTime.getResidue());}}}private static final String RESERVATION = "RESERVATION_";private void residueAddRedis(Date date, String guidanceTimeId, Integer residue) {SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");// 将 Date 对象转换为字符串String[] split = dateFormat.format(date).split("-");int year = Integer.parseInt(split[0]);int month = Integer.parseInt(split[1]);int day = Integer.parseInt(split[2]);// 获取当前日期和时间LocalDateTime now = LocalDateTime.now();// 获取过期日期LocalDateTime endDate = LocalDateTime.of(year, month, day, 0, 0, 0, 0);// 计算当前日期和时间到过期日期开始时间的时间差Duration duration = Duration.between(now, endDate);//过期时间秒long seconds = duration.getSeconds();//初始化到redisredisUtils.set(RESERVATION + guidanceTimeId, residue, seconds);}
4.患者预约方法
public void save(RqriGuidanceTimeRelation rqriGuidanceTimeRelation) {boolean b = reservationService.makeReservation(rqriGuidanceTimeRelation.getGuidanceTimeId());if (!b) {throw new BusinessException("该时段已无预约次数");}RqriGuidanceTime rqriGuidanceTime = rqriGuidanceTimelMapper.selectByPrimaryKey(rqriGuidanceTimeRelation.getGuidanceTimeId());Integer residue = rqriGuidanceTime.getResidue();// 可预约次数减1rqriGuidanceTime.setResidue(residue - 1);rqriGuidanceTimelMapper.updateByPrimaryKey(rqriGuidanceTime);Integer guidanceTimeId = rqriGuidanceTime.getGuidanceTimeId();redisUtils.decr(RESERVATION + guidanceTimeId, 1);// 添加预约信息rqriGuidanceTimeRelation.setIsfinish(0);rqriGuidanceTimeRelation.setCreateTime(new Date());rqriGuidanceTimeRelationMapper.insertSelective(rqriGuidanceTimeRelation);}public boolean makeReservation(Integer guidanceTimeId) {String key = RESERVATION + guidanceTimeId.toString();// 获取 Redisson 的分布式锁RLock lock = redissonClient.getLock(RESERVATION_LOCK);try {// 尝试获取锁lock.lock();// 使用 Redis 的原子操作来减少可预约数量Long availableTickets = redisTemplate.opsForValue().decrement(key);if (availableTickets < 0) {// 预约已满,预约失败,需要将可预约数量还原redisTemplate.opsForValue().increment(key);return false;}// 预约成功return true;} finally {// 释放锁lock.unlock();}}
5.患者修改预约
public void update(Integer reservationId, Integer guidanceTimeId) {//判断新的预约是否有次数可以 有的话 - 1boolean b = reservationService.makeReservation(guidanceTimeId);if (!b) {throw new Exception("该时段已无预约次数");}//查询新的时段是RqriGuidanceTime newGuidanceTime = rqriGuidanceTimelMapper.selectByPrimaryKey(guidanceTimeId);
// Integer residue = newGuidanceTime.getResidue();
// if (residue == 0) {
// throw new Exception("该时段已无预约次数");
// }//根据预约信息id 查询原预约时段idRqriGuidanceTimeRelation rqriGuidanceTimeRelation = rqriGuidanceTimeRelationMapper.selectByPrimaryKey(reservationId);//根据原预约时段id获取原预约时段数据RqriGuidanceTime old = rqriGuidanceTimelMapper.selectByPrimaryKey(rqriGuidanceTimeRelation.getGuidanceTimeId());//原预约时段次数+ 1redisUtils.incr(RESERVATION + old.getGuidanceTimeId(), 1);old.setResidue(old.getResidue() + 1);//更新原时段rqriGuidanceTimelMapper.updateByPrimaryKey(old);//新预约时段剩余次数-1newGuidanceTime.setResidue(newGuidanceTime.getResidue() - 1);rqriGuidanceTimelMapper.updateByPrimaryKey(newGuidanceTime);//更新预约详情rqriGuidanceTimeRelation.setGuidanceTimeId(guidanceTimeId);rqriGuidanceTimeRelationMapper.updateByPrimaryKey(rqriGuidanceTimeRelation);}
6.患者取消预约
public void delete(RqriGuidanceTimeRelation rqriGuidanceTimeRelation) throws ParseException {RqriGuidanceTime rqriGuidanceTime = rqriGuidanceTimelMapper.selectByPrimaryKey(rqriGuidanceTimeRelation.getGuidanceTimeId());rqriGuidanceTime.setResidue(rqriGuidanceTime.getResidue() + 1);rqriGuidanceTimelMapper.updateByPrimaryKey(rqriGuidanceTime);rqriGuidanceTimeRelationMapper.delete(rqriGuidanceTimeRelation);redisUtils.incr(RESERVATION + rqriGuidanceTimeRelation.getGuidanceTimeId(), 1);}
相关文章:
java实现医院门诊排班与预约系统【代码】
文章目录 前言一、遇到的问题二、实现过程1.数据库设计2.实体类3.医生添加排班或修改排班方法4.患者预约方法5.患者修改预约6.患者取消预约 前言 该文章从实际需求出发,实现医生设置自身排班与患者预约功能。 一、遇到的问题 1、医生设置的排班表不能有时间上的冲…...
8.Redis-set
Set 常用命令saddsmemberssismemberscardspopsmovesrem集合间操作sinter 交集sinterstoresunion 并集sunionstoresdiff 差集sdiffstore 命令总结 内部编码应用场景使用 set来保存用户的“标签” set(集合)就是把一些有关联的数据放刀一起。 它与list的区别如下: 集合…...
电子厂生产管理系统解决方案
越来越多的企业开始意识到数字化转型的重要性。在这个过程中,生产型企业面临着许多挑战,例如如何提高生产效率、节省企业资源以及改善生产工艺流程和产品质量。有一种解决方案可以帮助企业应对这些挑战,那就是生产管理系统。 生产管理系统是一…...
ARM DIY(五)摄像头调试
前言 今天,就着摄像头的调试,从嵌入式工程师的角度,介绍如何从无到有,一步一步地调出一款设备。 摄像头型号:OV2640 开发步骤 分为 2 个阶段 5 个步骤 阶段一: 设备树、驱动、硬件 阶段二: 应…...
hadoop2.2.0伪分布式搭建
1.准备Linux环境 1.0点击VMware快捷方式,右键打开文件所在位置 -> 双击vmnetcfg.exe -> VMnet1 host-only ->修改subnet ip 设置网段:192.168.1.0 子网掩码:255.255.255.0 -> apply -> ok 回到windows --> 打开…...
高级IO(select、poll、epoll)
在介绍本文之前,先提出一个问题 什么是IO? 等数据拷贝 1.等 - IO事件就绪(检测功能成分) 2.数据拷贝 高效的IO就是:单位时间,等的比重越小,IO的效率越高 五种IO模型 IO模型: 阻塞式…...
Ceph基础知识和基础架构认识
1 Ceph基础介绍 Ceph是一个可靠地、自动重均衡、自动恢复的分布式存储系统,根据场景划分可以将Ceph分为三大块,分别是对象存储、块设备存储和文件系统服务。在虚拟化领域里,比较常用到的是Ceph的块设备存储,比如在OpenStack项目…...
【C++】快速排序的学习和介绍
前言 本篇文章我们先会学习快速排序这个算法,之后我们会学习sort这个函数 分治算法 在学习快速排序之前,我们先来学习一下分治算法,快速排序就是分治算法的一种,下面是分治算法的介绍, 分治算法,就是”…...
第九章 动态规划part12(代码随想录)
309.最佳买卖股票时机含冷冻期 1. 确定dp数组(dp table)以及下标的含义 dp[i][j],第i天状态为j,所剩的最多现金为dp[i][j]。 2. 确定递推公式 拆分卖出股票状态是因为冷冻期前一天一定是具体卖出股票状态。 状态一 dp[i][0]&…...
ssm珠宝首饰交易平台源码和论文
ssm珠宝首饰交易平台源码和论文101 开发工具:idea 数据库mysql5.7 数据库链接工具:navcat,小海豚等 技术:ssm 摘 要 随着科学技术的飞速发展,各行各业都在努力与现代先进技术接轨,通过科技手段提高自身的优势&a…...
交互设计都有哪些准则?
UI交互设计的本质不是完全基于用户的需求,而是交互设计师需要学习根据用户描述的产品形式来了解用户需要什么。 在交互设计过程中,遵循科学交互设计的本质是整个交互设计过程的重要组成部分,这与产品使用过程中给用户带来的体验密切相关。本…...
【MySQL】从哪几个角度分析数据库失败的原因?
总体评估MySQL服务器感谢 💖 总体评估 当发现数据库出现问题时,我们首先应该从全局的角度考虑架构中的所有组件。包括: 服务器(数据库和应用程序) 存储:存储故障可能导致关键信息丢失网络接口:…...
Spring Boot 的核心注解SpringBootApplication
SpringBootApplication 包括的注解 SpringBootConfiguration 组合了 Configuration 注解,实现配置文件的功能。 EnableAutoConfiguration 打开自动配置的功能,也可以关闭某个自动配置的选项, 例如:java 如关闭数据源自动配置功…...
自助式数据分析平台:JVS智能BI功能介绍(一)数据源
一、数据源配置 数据源概述 数据源是JVS-智能BI支持多种数据形态的基础,核心的目标是将不同的数据来源通过统一接入,实现将不同的数据实现统一的数据加工、数据应用。目前JVS-智能BI主要支持3种形态的数据:数据库、API、离线文件。 界面介…...
CSS魔术师Houdini,用浏览器引擎实现高级CSS效果
开门见山,直接上货 🔍 CSS Houdini是什么? “Houdini”一词引用自“Harry Houdini”,他是一位20世纪的著名魔术师,亦被称为史上最伟大的魔术师、逃脱术师及特级表演者。 我们都知道,浏览器在渲染网页显示样…...
DC/DC开关电源学习笔记(二)开关电源的分类
(二)开关电源的分类 1.DC/DC类开关电源2.AC/DC变换器3.电路结构分类4.功率开关管分类5.电路拓扑分类 根据变换方式,电源产品有下列四大类; (1):第一大类:AC/DC开关电源; …...
conda创建python虚拟环境
1.查看当前存在那些虚拟环境 conda env list conda info -e 2.conda安装虚拟环境 conda create -n my_env_name python3.6 2.1在anaconda下改变python版本 当前3.7 安装3.7 conda create -n py37 python3.7 conda activate py37 conda create -n py37 python3.7conda a…...
Python 操作 MongoDB 数据库介绍
MongoDB 是一款面向文档型的 NoSQL 数据库,是一个基于分布式文件存储的开源的非关系型数据库系统,其内容是以 K/V 形式存储,结构不固定,它的字段值可以包含其他文档、数组和文档数组等。其采用的 BSON(二进制 JSON &am…...
【ES6】Generator 函数
Generator 函数是 ES6 引入的一种新的函数类型,它既可以生成一个序列,又可以在某个条件下停止执行,并在需要时恢复执行。Generator 函数非常适合处理那些需要按需计算的场景,例如处理大数据、生成随机数等。 Generator 函数的基本…...
「操作系统」1. 基础
前言:操作系统基础八股文 文章目录 一 、操作系统基础1.1 什么是操作系统?1.2 什么是系统调用1.3 什么是中断 🚀 作者简介:作为某云服务提供商的后端开发人员,我将在这里与大家简要分享一些实用的开发小技巧。在我的职…...
uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖
在前面的练习中,每个页面需要使用ref,onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入,需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...
土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等
🔍 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术,可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势,还能有效评价重大生态工程…...
网络编程(UDP编程)
思维导图 UDP基础编程(单播) 1.流程图 服务器:短信的接收方 创建套接字 (socket)-----------------------------------------》有手机指定网络信息-----------------------------------------------》有号码绑定套接字 (bind)--------------…...
Linux --进程控制
本文从以下五个方面来初步认识进程控制: 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程,创建出来的进程就是子进程,原来的进程为父进程。…...
初学 pytest 记录
安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...
NXP S32K146 T-Box 携手 SD NAND(贴片式TF卡):驱动汽车智能革新的黄金组合
在汽车智能化的汹涌浪潮中,车辆不再仅仅是传统的交通工具,而是逐步演变为高度智能的移动终端。这一转变的核心支撑,来自于车内关键技术的深度融合与协同创新。车载远程信息处理盒(T-Box)方案:NXP S32K146 与…...
Mysql中select查询语句的执行过程
目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析(Parser) 2.4、执行sql 1. 预处理(Preprocessor) 2. 查询优化器(Optimizer) 3. 执行器…...
R 语言科研绘图第 55 期 --- 网络图-聚类
在发表科研论文的过程中,科研绘图是必不可少的,一张好看的图形会是文章很大的加分项。 为了便于使用,本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中,获取方式: R 语言科研绘图模板 --- sciRplothttps://mp.…...
规则与人性的天平——由高考迟到事件引发的思考
当那位身着校服的考生在考场关闭1分钟后狂奔而至,他涨红的脸上写满绝望。铁门内秒针划过的弧度,成为改变人生的残酷抛物线。家长声嘶力竭的哀求与考务人员机械的"这是规定",构成当代中国教育最尖锐的隐喻。 一、刚性规则的必要性 …...
java高级——高阶函数、如何定义一个函数式接口类似stream流的filter
java高级——高阶函数、stream流 前情提要文章介绍一、函数伊始1.1 合格的函数1.2 有形的函数2. 函数对象2.1 函数对象——行为参数化2.2 函数对象——延迟执行 二、 函数编程语法1. 函数对象表现形式1.1 Lambda表达式1.2 方法引用(Math::max) 2 函数接口…...
