期货日数据维护与使用_日数据维护_日数据更新

目录

写在前面:

下载日数据

下载“新增合约”日数据

下载“待更新合约”日数据

日数据文件

“选择日数据所在目录”按钮点击 

 “执行”按钮点击

sqlite3代码

按钮点击后执行的代码

子线程代码


写在前面:

本文默认已经创建了项目,如果不知道如何创建一个空项目的,请参看以下两篇博文

PyQt5将项目搬到一个新的虚拟环境中
https://blog.csdn.net/m0_37967652/article/details/122625280
python_PyQt5开发工具结构基础
https://blog.csdn.net/m0_37967652/article/details/131969032

前序:

【期货日数据维护与使用_日数据维护_sqlite3数据库创建】博文

【期货日数据维护与使用_日数据维护_界面代码】博文

【期货日数据维护与使用_日数据维护_合约更新】博文

下载日数据

下载“新增合约”日数据

“新增合约”列表下载后在 new.json 中

在优矿中执行的代码 

ticker_list = ["fu2501", "lu2501", "sc2501"]
df = DataAPI.MktFutdGet(secID=u"",ticker=ticker_list,tradeDate=u"",beginDate=u"",endDate=u"",exchangeCD="",field=u"",pandas="1")
df.to_csv('daily_20240106_00.csv',encoding='utf-8')

下载“待更新合约”日数据

“待更新合约”列表下载后在 {日期}.json,可能会有多个{日期}.json

在优矿中执行的代码

ticker_list = ["AP401", "AP403", "AP404", "AP405", ...]
df = DataAPI.MktFutdGet(secID=u"",ticker=ticker_list,tradeDate=u"",beginDate=u"20240103",endDate=u"",exchangeCD="",field=u"",pandas="1")
df.to_csv('daily_20240106_11.csv',encoding='utf-8')

日数据文件

 日数据字段列表:

['secID','ticker','exchangeCD','secShortName','tradeDate','contractObject','contractMark','preSettlePrice','preClosePrice','openPrice','highestPrice','lowestPrice','closePrice','settlePrice','turnoverVol','turnoverValue','openInt','CHG','CHG1','CHGPct','mainCon','smainCon','limitUpPrice','limitDownPrice']

想知道字段含义,可以自行到优矿网站查看

“选择日数据所在目录”按钮点击 

    def choice_daily_dir_btn_clicked(self):path = QtWidgets.QFileDialog.getExistingDirectory(self,'选择日数据所在目录',SQLITE_FROM_DIR)if not path:returnself.choice_daily_dir_lineedit.setText(path)pass

 “执行”按钮点击

更新日数据的过程在子线程中进行,任务表示定义为  self.mark_str_step_two 常量,常量定义在 init_data()方法中

更新日数据逻辑:
1 将下载所得的日数据文件合并到一个 pd.DataFrame 中
2 从 t_symbol_basemsg 中获取到 日数据包含的合约名的品种、交割年份信息
3 将日数据追加到合约的csv文件,如果是新增的合约,创建新的csv文件;同时也把日数据插入到 t_last30_daily
4 更新 t_online_symbol 数据
5 计算主力合约,按品种逐一进行计算,并更新csv文件
5.1 主力合约换月规则参照文化财经的换月规则
5.2 从 t_last30_daily 获取某品种最近的日数据
5.3 如果某日只有一个合约,该合约为主力合约
5.4 计算某日 “成交量最大” 和 “持仓量最大” 的合约
5.5 如果“成交量最大”和“持仓量最大”的合约是同一个,并且与之前的主力合约也是同一个,那主力合约延续,不切换
5.6 如果“成交量最大”和“持仓量最大”的合约是同一个,但与之前的主力合约不是同一个,那预备下一个交易日主力合约切换为今日同时“成交量最大”和“持仓量最大”的合约,到下一个交易日,如果预备切换的合约依然是同时“成交量最大”和“持仓量最大”,切换,如果不是,不切换,主力合约延续
5.7 如果“成交量最大”和“持仓量最大”的合约不是同一个,那只要“成交量最大”是之前的主力合约,或“持仓量最大”是之前的主力合约,主力合约延续,不切换
5.8 如果“成交量最大”和“持仓量最大”的合约不是同一个,且都不是之前的主力合约,那主力合约取“成交量最大”的合约作为新的主力合约,当日切换

sqlite3代码

t_symbol_basemsg 查询日数据合约对应的合约信息

def query_pro_ticker_deliYear_from_symbol_basemsg_by_query(tickers:List,deliYear:int):conn = sqlite3.connect(YOUKUANG_DB_NAME)c = conn.cursor()# sticker_str = '\',\''.join(tickers)ticker_str = '\'' + ticker_str + '\''sql_str = '''select product_code,ticker,deliYear from t_symbol_basemsg where ticker in ({tickers}) and deliYear>={deliYear}'''.format(tickers=ticker_str,deliYear=deliYear)c.execute(sql_str)res_list = c.fetchall()# econn.commit()conn.close()return res_list

t_last30_daily 批量插入数据

def batch_insert_last30_daily(pre_list: List):conn = sqlite3.connect(YOUKUANG_DB_NAME)c = conn.cursor()# ssql_str = '''insert into t_last30_daily values (?,?,?,?,?,?,?,?,?,?,?,?)'''c.executemany(sql_str,pre_list)# econn.commit()conn.close()pass

t_online_symbol 清空表格数据

def delete_all_data_of_online_symbol():conn = sqlite3.connect(YOUKUANG_DB_NAME)c = conn.cursor()# ssql_str = '''delete from t_online_symbol'''c.execute(sql_str)# econn.commit()conn.close()pass

t_online_symbol 批量插入数据

def batch_insert_online_symbol(pre_list:List):conn = sqlite3.connect(YOUKUANG_DB_NAME)c = conn.cursor()# ssql_str = '''insert into t_online_symbol values (?,?,?,?)'''c.executemany(sql_str, pre_list)# econn.commit()conn.close()pass

t_product 查询所有品种

def query_all_product_codes_of_product():conn = sqlite3.connect(YOUKUANG_DB_NAME)c = conn.cursor()# ssql_str = '''select code from t_product'''c.execute(sql_str)res_list = c.fetchall()# econn.commit()conn.close()res_list00 = []for item in res_list:res_list00.append(item[0])return res_list00

t_last30_daily 查询某品种最近的日数据

def query_daily_by_pro_in_last30_daily(product_code:str):conn = sqlite3.connect(YOUKUANG_DB_NAME)c = conn.cursor()# sproduct_code_str = '\'' + product_code + '\''sql_str = '''select product_code,ticker,deliYear,tradeDate,openPrice,highestPrice,lowestPrice,closePrice,settlePrice,turnoverVol,turnoverValue,openInt from t_last30_daily where product_code={product_code}'''.format(product_code=product_code_str)c.execute(sql_str)res_list = c.fetchall()# econn.commit()conn.close()return res_list

t_main_symbol 新增品种就插入,已有品种如果主力合约切换就更新

def input_main_symbol(product_code:str,ticker:str,deliYear:int,start_date:str=None):conn = sqlite3.connect(YOUKUANG_DB_NAME)c = conn.cursor()# sproduct_code_str = '\''+product_code+'\''sql_str_query = '''select * from t_main_symbol where product_code={product_code}'''.format(product_code=product_code_str)c.execute(sql_str_query)res_one = c.fetchone()if len(res_one)<=0:# 新增品种插入pre_one = [product_code,ticker,deliYear,start_date]one_insert_main_symbol(pre_one)passelse:# 已有品种修改update_main_symbol(product_code,ticker,deliYear,start_date)pass# econn.commit()conn.close()pass

按钮点击后执行的代码

    def excute_step_two_btn_clicked(self):dir_path = self.choice_daily_dir_lineedit.text()if len(dir_path) <= 0:QtWidgets.QMessageBox.information(self,'提示','请选择日数据所在目录',QtWidgets.QMessageBox.Yes)returnpre_map = {'dir_path': dir_path,'cur_deliYear': self.deliYear_spinbox.value()}self.start_caculate_thread(self.mark_str_step_two, pre_map)pass

子线程代码

子线程中任务名为 self.mark_str_step_two 的执行代码,于 running_caculate_thread 方法中对应任务名下

dir_path = data['dir_path']
cur_deliYear = data['cur_deliYear']file_list = os.listdir(dir_path)
if len(file_list)<=0:self.thread_out_log('Error Error 没有日数据文件')pre_map = {'mark_str':self.mark_str_error,'data':'Error Error 没有日数据文件'}self.signal_excute.emit(pre_map)return
# 将下载的日数据合并到同一个df中
df = pd.DataFrame()
for item in file_list:file_path = dir_path + os.path.sep + itemdf_one = pd.read_csv(file_path,encoding='utf-8')if not df_one.columns.isin(self.d_csv_column_list).any():self.thread_out_log(f"{item},文件不是日数据文件")continuedf = pd.concat([df,df_one])pass
if len(df)<=0:self.thread_out_log('Error Error 没有要更新的日数据')pre_map = {'mark_str': self.mark_str_error,'data': 'Error Error 没有要更新的日数据'}self.signal_excute.emit(pre_map)returnpre_add_tickers = df['ticker'].unique()
ticker_list = sqlite_tool.query_pro_ticker_deliYear_from_symbol_basemsg_by_query(pre_add_tickers,cur_deliYear)
ticker_map = {}
for item in ticker_list:ticker_map[item[1]] = itempass
df['o_date'] = pd.to_datetime(df['tradeDate'])
online_symbol_list = []
df_group = df.groupby(by='ticker',as_index=False)
self.thread_out_log('开始逐一处理每个合约:')
for name,group in df_group:self.thread_out_log(f'开始追加 {name}')# 将新数据添加到 t_last30_dailypre_new_df = group.loc[:,self.d_csv_column_list].copy()pre_new_df['product_code'] = ticker_map[name][0]pre_new_df['ticker'] = ticker_map[name][1]pre_new_df['deliYear'] = ticker_map[name][2]pre_new_list = pre_new_df.loc[:,self.last30_daily_column_list].values.tolist()sqlite_tool.batch_insert_last30_daily(pre_new_list)# 将新数据更新到csvcsv_file_name = f"{name}_{ticker_map[name][2]}.csv"csv_file_path = YOUKUANG_D_DIR + csv_file_nameif not os.path.exists(csv_file_path):exist_df = pd.DataFrame()else:df_one = pd.read_csv(csv_file_path,encoding='utf-8')df_one['o_date'] = pd.to_datetime(df_one['tradeDate'])exist_df = df_one.loc[:,self.pre_d_csv_column_list].copy()passnew_df = group.loc[:,self.pre_d_csv_column_list].copy()if len(exist_df)>0:exist_df.sort_values(by='o_date',ascending=True,inplace=True)new_df = new_df.loc[new_df['o_date']>exist_df.iloc[-1]['o_date']].copy()passif len(new_df)>0:pre_save_df = pd.concat([exist_df,new_df])pre_save_df.sort_values(by='o_date',ascending=True,inplace=True)pre_save_df = pre_save_df.loc[:,self.d_csv_column_list].copy()pre_save_df.to_csv(csv_file_path,encoding='utf-8')online_symbol_list.append([ticker_map[name][0],name,ticker_map[name][2],pre_save_df.iloc[-1]['tradeDate']])passpass# 删除 t_online_symbol 表格,加入新数据
self.thread_out_log('t_online_symbol表格更新')
sqlite_tool.delete_all_data_of_online_symbol()
sqlite_tool.batch_insert_online_symbol(online_symbol_list)self.thread_out_log('------------- 开始计算主力合约:')
product_code_list = sqlite_tool.query_all_product_codes_of_product()
for pro_code in product_code_list:self.thread_out_log(f'产品:{pro_code}')csv_main_file_path = YOUKUANG_MAIN_DIR + pro_code + '.csv'if not os.path.exists(csv_main_file_path):# 新增品种cur_main_ticker = Nonecur_main_deliYear = Nonelast_one_tradeDate = Nonepasselse:df_one = pd.read_csv(csv_main_file_path,encoding='utf-8')df_one['o_date'] = pd.to_datetime(df_one['tradeDate'])df_one.sort_values(by='o_date',ascending=True,inplace=True)cur_main_ticker = df_one.iloc[-1]['ticker']cur_main_deliYear = df_one.iloc[-1]['deliYear']last_one_tradeDate = df_one.iloc[-1]['tradeDate']pass# 从 t_last30_daily 中计算追加这几天的主力合约daily_list = sqlite_tool.query_daily_by_pro_in_last30_daily(pro_code)df_two = pd.DataFrame(columns=self.pre_main_csv_column_list,data=daily_list)df_two['o_date'] = pd.to_datetime(df_two['tradeDate'])if last_one_tradeDate:df_two = df_two.loc[df_two['o_date']>last_one_tradeDate].copy()df_two.dropna(inplace=True)if len(df_two) <= 0:self.thread_out_log(f'{pro_code},没有可追加的主力数据')continuedf_two['row_i'] = [i for i in range(len(df_two))]df_two_group = df_two.groupby(by='o_date',as_index=False)df_main_new = pd.DataFrame()next_change_yeah = Falsepre_next_main_ticker = Nonepre_next_main_deliYear = Nonefor two_name,group in df_two_group:if len(group)<=1:# 当天该品种只有一个合约,那当天主力合约就为该合约df_main_new = pd.concat([df_main_new,group.iloc[[0]]])sqlite_tool.input_main_symbol(pro_code, group.iloc[0]['ticker'], group.iloc[0]['deliYear'],group.iloc[0]['tradeDate'])cur_main_ticker = group.iloc[0]['ticker']cur_main_deliYear = group.iloc[0]['deliYear']passelse:# 计算每日最大成交量和最大持仓量df_vol = group.sort_values(by='turnoverVol', ascending=False)df_inte = group.sort_values(by='openInt', ascending=False)if df_vol.iloc[0]['row_i'] == df_inte.iloc[0]['row_i']:
# 当日成交量最大和持仓量最大 为同一个合约
if next_change_yeah:# 前一个交易日满足 【主力合约要被切换,下一个交易日切换为新的合约】条件,# 检查今日新的合约是否依然是成交量和持仓量最大,如果不是,不切换新合约if pre_next_main_ticker == df_vol.iloc[0]['ticker'] and pre_next_main_deliYear == \df_vol.iloc[0]['deliYear']:# 切换新合约df_main_new = pd.concat([df_main_new, df_vol.iloc[[0]]])sqlite_tool.input_main_symbol(pro_code, df_vol.iloc[0]['ticker'], df_vol.iloc[0]['deliYear'],df_vol.iloc[0]['tradeDate'])cur_main_ticker = pre_next_main_tickercur_main_deliYear = pre_next_main_deliYearnext_change_yeah = Falsepasselse:# 撤销昨日的 【主力合约要被切换,下一个交易日切换为新的合约】next_change_yeah = False# ----------- 【当日成交量最大和持仓量最大 为同一个合约】 延续当前合约 startpre_next_main_ticker = df_vol.iloc[0]['ticker']pre_next_main_deliYear = df_vol.iloc[0]['deliYear']if pre_next_main_ticker == cur_main_ticker and pre_next_main_deliYear == cur_main_deliYear:# 主力合约没有切换,延续使用df_main_new = pd.concat([df_main_new, df_vol.iloc[[0]]])passelse:# 主力合约要被切换,下一个交易日切换为新的合约next_change_yeah = Truecur_df = group.loc[(group['ticker'] == cur_main_ticker) & (group['deliYear'] == cur_main_deliYear)].copy()df_main_new = pd.concat([df_main_new, cur_df])pass# ----------- 【当日成交量最大和持仓量最大 为同一个合约】 延续当前合约 endpasspass
else:# ----------- 【当日成交量最大和持仓量最大 为同一个合约】 延续当前合约 startpre_next_main_ticker = df_vol.iloc[0]['ticker']pre_next_main_deliYear = df_vol.iloc[0]['deliYear']if pre_next_main_ticker == cur_main_ticker and pre_next_main_deliYear == cur_main_deliYear:# 主力合约没有切换,延续使用df_main_new = pd.concat([df_main_new, df_vol.iloc[[0]]])passelse:# 主力合约要被切换,下一个交易日切换为新的合约next_change_yeah = Truecur_df = group.loc[(group['ticker'] == cur_main_ticker) & (group['deliYear'] == cur_main_deliYear)].copy()df_main_new = pd.concat([df_main_new, cur_df])pass# ----------- 【当日成交量最大和持仓量最大 为同一个合约】 延续当前合约 endpasselse:
# 当日成交量最大 和 持仓量最大 为不同的合约
# 成交量最大 或 持仓量最大,这两者中有一个的合约是当前主力合约,该主力合约就延续
if df_vol.iloc[0]['ticker'] == cur_main_ticker and df_vol.iloc[0]['deliYear'] == cur_main_deliYear:df_main_new = pd.concat([df_main_new, df_vol.iloc[[0]]])
elif df_inte.iloc[0]['ticker'] == cur_main_ticker and df_inte.iloc[0]['deliYear'] == cur_main_deliYear:df_main_new = pd.concat([df_main_new, df_inte.iloc[[0]]])
else:# 当日成交量最大 和 持仓量最大 都不是当前主力合约,将主力合约切换为成交量最大的合约df_main_new = pd.concat([df_main_new, df_vol.iloc[[0]]])sqlite_tool.input_main_symbol(pro_code, df_vol.iloc[0]['ticker'], df_vol.iloc[0]['deliYear'],df_vol.iloc[0]['tradeDate'])cur_main_ticker = df_vol.iloc[0]['ticker']cur_main_deliYear = df_vol.iloc[0]['deliYear']pass
passpasspassif len(df_main_new)<=0:self.thread_out_log(f'{pro_code},没有新增主力合约数据')passelse:df_main_new = df_main_new.loc[:,self.main_csv_column_list].copy()if not os.path.exists(csv_main_file_path):df_main_new.to_csv(csv_main_file_path, encoding='utf-8')passelse:df_one = df_one.loc[:, self.main_csv_column_list].copy()df_main_new00 = pd.concat([df_one, df_main_new])df_main_new00 = df_main_new00.loc[:, self.main_csv_column_list].copy()df_main_new00.to_csv(csv_main_file_path, encoding='utf-8')passpasspasspre_map = {'mark_str': self.mark_str_step_two,'data':None
}
self.signal_excute.emit(pre_map)
pass

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

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

相关文章

reiserfs文件系统的磁盘布局

reiserfs文件系统的磁盘布局比较简单&#xff0c;它把整块分区分成相同大小的block块&#xff0c;一个block块的大小默认是4K&#xff0c;而最大块数未2^32次方&#xff0c;即一个分区最大大小为16TB。 reiserfs文件系统分区的前64KB总是为分区标签&#xff08;partition labe…

第九节HarmonyOS 常用基础组件11-TextPicker

1、描述 滑动选择文本内容的组件。 2、接口 TextPicker(options?: {range: string[]|Resource, selected?: number, value?: string}) 3、参数 参数名称 参数类型 必填 描述 range string[]|Resource 是 选择器的数据。 selected number 否 设置默认选中项在…

【普中开发板】基于51单片机的温度报警器LCD1602_可调上下限( proteus仿真+程序+设计报告+讲解视频)

基于51单片机的温度报警器LCD1602_可调上下限 1.主要功能&#xff1a;资料下载链接&#xff1a; 普中开发板实物演示图&#xff1a;2.仿真3. 程序代码4. 设计报告5. 设计资料内容清单 【普中】基于51单片机的温度报警器LCD1602_可调上下限 ( proteus仿真程序设计报告讲解视频&a…

服务器内存不足怎么办?会有什么影响?

服务器内存&#xff0c;也被称为RAM&#xff08;Random Access Memory&#xff09;&#xff0c;是一种临时存储设备&#xff0c;用于临时存放正在运行的程序和数据。它是服务器上的超高速存储介质&#xff0c;可以快速读取和写入数据&#xff0c;提供给CPU进行实时计算和操作。…

跟着小德学C++之安全模块

嗨&#xff0c;大家好&#xff0c;我是出生在达纳苏斯的一名德鲁伊&#xff0c;我是要立志成为海贼王&#xff0c;啊不&#xff0c;是立志成为科学家的德鲁伊。最近&#xff0c;我发现我们所处的世界是一个虚拟的世界&#xff0c;并由此开始&#xff0c;我展开了对我们这个世界…

遇见未来的你——感谢你带给我的感悟

目录 一、背景介绍二、思路&方案三、过程1.都说有的人出生就在罗马而有的人却用一辈子都在去向罗马的路上1.1.物质&#xff1a;1.2.精神&#xff1a; 2.做事情要看大再看细3.心存善念&#xff0c;常怀感恩&#xff0c;从小事做起4.所谓的面子在母爱面前像是一粒微尘5.讲道理…

【强化学习的数学原理-赵世钰】课程笔记(六)随机近似与随机梯度下降

目录 一.内容概述 二.激励性实例&#xff08;Motivating examples&#xff09; 三.Robbins-Monro 算法&#xff08;RM 算法&#xff09;&#xff1a; 1.算法描述 2.说明性实例&#xff08;llustrative examples&#xff09; 3.收敛性分析&#xff08;Convergence analysi…

Spark基础内容

Spark基本介绍 Spark是什么 定义 Apache Spark是用于大规模数据(large-scala data)处理的统一(unified)分析引擎. Spark与MapReduce对比 mapreduce架构图如下: MapReduce的主要缺点&#xff1a; 1- MapReduce是基于进程进行数据处理&#xff0c;进程相对线程来说&#x…

十一、工具盒类(MyQQ)(Qt5 GUI系列)

目录 ​编辑 一、设计需求 二、实现代码 三、代码解析 四、总结 一、设计需求 抽屉效果是软件界面设计中的一种常用形式&#xff0c;可以以一种动态直观的方式在有限大小的界面上扩展出更多的功能。本例要求实现类似 QQ 抽屉效果。 二、实现代码 #include "dialog.…

数据结构实验1:栈和队列的应用

目录 一、实验目的 二、实验原理 1.1栈的基本操作 1.1.1 栈的定义 1.1.2 初始化栈 1.1.3 压栈&#xff08;Push&#xff09; 1.1.4 出栈&#xff08;Pop&#xff09; 1.1.5 判空&#xff08;isEmpty&#xff09; 1.1.6 查看栈顶元素&#xff08;Top&#xff09; 1.1…

el-date-picker日期时间选择器限制可选的日期范围

业务场景&#xff1a;需要限制日期时间选择器可选择的日期&#xff0c;有两种模式&#xff0c; 一种是已知范围&#xff0c;只能选已知范围内的日期&#xff0c; 另一种是知道最近天数&#xff0c;只能选今天往前的天数内的日期&#xff0c;超出不能选。 <el-date-picker v-…

软性演员-评论家算法 SAC

软性演员-评论家算法 SAC 软性演员-评论家算法 SAC优势原理软性选择模型结构目标函数重参数化熵正则化算法步骤代码实现 软性演员-评论家算法 SAC 优势原理 DDPG 的问题在于&#xff0c;训练不稳定、收敛差、依赖超参数、不适应复杂环境。 软性演员-评论家算法 SAC&#xff…

算法通关村番外篇-优先队列

大家好我是苏麟 , 今天聊聊优先队列 . 优先队列 我们了解优先队列之前先说说队列 . 队列的特点是什么&#xff1f; 队列的特点是先进先出&#xff08;FIFO&#xff09;。 入队列&#xff0c;将新元素置于队尾&#xff1a; 出队列&#xff0c;队头元素最先被移出&#xff1a…

从新手到大师:四大编程范式解锁你的编码力!

编程&#xff0c;就是用代码跟计算机交流&#xff0c;告诉它我们想要它做什么。不同的编程范式就是不同的交流方式&#xff0c;每种方式都有自己独特的语法和规则。 今天&#xff0c;我们就来聊聊这四种主要的编程范式&#xff0c;它们分别是命令式、函数式、面向对象和声明式…

Java 堆的设计,如何用堆进行排序

Java 学习面试指南&#xff1a;https://javaxiaobear.cn 1、堆的定义 堆是计算机科学中一类特殊的数据结构的统称&#xff0c;堆通常可以被看做是一棵完全二叉树的数组对象。 1、堆的特性 它是完全二叉树&#xff0c;除了树的最后一层结点不需要是满的&#xff0c;其它的每一层…

听GPT 讲Rust源代码--compiler(33)

File: rust/compiler/rustc_middle/src/macros.rs 在Rust源代码中&#xff0c;rust/compiler/rustc_middle/src/macros.rs文件的作用是定义了一些用于宏展开的辅助宏和宏规则。 首先&#xff0c;这个文件导入了许多其他相关的模块&#xff0c;这些模块定义了编译器内部所需要的…

详解Java中的原子操作

第1章&#xff1a;什么是原子操作 大家好&#xff0c;我是小黑&#xff0c;面试中一个经常被提起的话题就是“原子操作”。那么&#xff0c;到底什么是原子操作呢&#xff1f;在编程里&#xff0c;当咱们谈论“原子操作”时&#xff0c;其实是指那些在执行过程中不会被线程调度…

1329:【例8.2】细胞 广度优先搜索

1329&#xff1a;【例8.2】细胞 时间限制: 1000 ms 内存限制: 65536 KB 【题目描述】 一矩形阵列由数字0 到9组成,数字1到9 代表细胞,细胞的定义为沿细胞数字上下左右还是细胞数字则为同一细胞,求给定矩形阵列的细胞个数。如: 4 10 0234500067 1034560500 2045600671 00000000…

最新-mybatis-plus 3.5分页插件配置

mybatis-plus 3.5分页插件配置 前提 1.项目不是springboot, 是以前的常规spring项目 2.mp 从3.2升级到3.5&#xff0c;升级后发现原本的分页竟然不起作用了&#xff0c;每次查询都是查出所有 前后配置对比 jar包对比 jsqlparser我这里单独引了包&#xff0c;因为版本太低…

数据结构入门到入土——链表(2)

目录 一&#xff0c;与链表相关的题目&#xff08;2&#xff09; 1.输入两个链表&#xff0c;找出它们的第一个公共节点 2.给定一个链表&#xff0c;判断链表中是否有环 3.给定一个链表&#xff0c;返回链表开始入环的第一个节点&#xff0c;若无则返回null 一&#xff0c;…