省市区(输入code) 转相应省市区工具类(两种方式)

 方式一 通过调用接口(时间高达1s)

package cn.iocoder.yudao.module.supplier.utils;import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;/**** 区域划分代码工具类 只需要传 相应代码值 就会返回 对应区域*/
public class AdministrativeRegionUtil {private static final String BASE_URL = "https://xingzhengquhua.bmcx.com/";public static String getAdministrativeRegionData(String regionCode) {regionCode = padRegionCode(regionCode);String urlString = BASE_URL + regionCode + "__xingzhengquhua/";StringBuilder result = new StringBuilder();try {URL url = new URL(urlString);HttpURLConnection conn = (HttpURLConnection) url.openConnection();conn.setRequestMethod("GET");int responseCode = conn.getResponseCode();if (responseCode == HttpURLConnection.HTTP_OK) { // successBufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8"));String inputLine;while ((inputLine = in.readLine()) != null) {result.append(inputLine);}in.close();} else {System.out.println("GET request not worked");}} catch (Exception e) {e.printStackTrace();}return result.toString();}public static String padRegionCode(String regionCode) {if (regionCode == null) {throw new IllegalArgumentException("Region code cannot be null");}return String.format("%-12s", regionCode).replace(' ', '0');}public static String parseRegionData(String html) {Document doc = Jsoup.parse(html);Element h3Element = doc.selectFirst("td:contains(行政区划代码) h3");Element spanElement = doc.selectFirst("td:contains(行政区划代码) span");if (h3Element != null && spanElement != null) {String regionName = h3Element.text();String regionCode = spanElement.text();return "RegionName: " + regionName + ", RegionCode: " + regionCode;}return "Data not found";}public static String getAndParseRegionData(String regionCode) {String htmlData = getAdministrativeRegionData(regionCode);return parseRegionData(htmlData);}public static void main(String[] args) {String regionCode = "650000"; // Example region codeString parsedData = getAndParseRegionData(regionCode);System.out.println(parsedData);}
}

 运行之后代码

ca4b123ad6844e3ab5eac4579fb2e59c.png

261ab19811ea415185022e884d1a61ee.png

5d812d99c74f4f258714caca61e5807c.png

方式二 通过读文件 存入redis缓存中 

文件格式举例   

推荐一个文本格式化网站 中英文自动加空格 - 小牛知识库 (xnip.cn)

110000 北京市
110101 东城区
110102 西城区
110105 朝阳区
110106 丰台区
110107 石景山区
110108 海淀区
110109 门头沟区
110111 房山区
110112 通州区
110113 顺义区
110114 昌平区
110115 大兴区

代码

配置类

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.connection.RedisStandaloneConfiguration;
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;@Configuration
public class RedisConfig {@Value("${spring.redis.host}")private String host;@Value("${spring.redis.port}")private int port;@Value("${spring.redis.database}")private int database;@Beanpublic RedisConnectionFactory redisConnectionFactory() {RedisStandaloneConfiguration config = new RedisStandaloneConfiguration(host, port);config.setDatabase(database);return new LettuceConnectionFactory(config);}
}

读取文件到redis的工具类

package cn.iocoder.yudao.module.supplier.utils;import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;import javax.annotation.PostConstruct;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;import org.springframework.data.redis.core.HashOperations;/**** 地区工具类 自动注入redis**/
@Component
@Slf4j
public class RedisDataLoader {private static final String FILE_PATH = "yudao-module-supplier/yudao-module-supplier-biz/src/main/java/cn/iocoder/yudao/module/supplier/utils/file/locateFile.txt"; // 替换为你的文件路径private static final String CODE_TO_LOCATION_KEY = "LocationByCode"; // Redis Hash 的键private static final String LOCATION_TO_CODE_KEY = "CodeByLocation"; // Redis Hash 的键@Autowiredprivate RedisTemplate<String, String> redisTemplate;@PostConstructpublic void loadFileToRedis() {// 读取文件行数,用于检查是否拥有所有数据int expectedDataCount = countLines(FILE_PATH);// 查询 Redis 中已有数据的数量long existingDataCount = redisTemplate.opsForHash().size(CODE_TO_LOCATION_KEY);// 如果 Redis 中数据不足预期数量,则继续加载数据if (existingDataCount < expectedDataCount) {try (BufferedReader br = new BufferedReader(new FileReader(FILE_PATH))) {String line;HashOperations<String, String, String> codeToLocationHashOps = redisTemplate.opsForHash();HashOperations<String, String, String> locationToCodeHashOps = redisTemplate.opsForHash();int count = 0; // 计数器while ((line = br.readLine()) != null) {String[] parts = line.trim().split("\\s+", 2); // 使用空格字符分割,限制为两部分if (parts.length == 2) {String code = parts[0].trim(); // 第一部分作为区域代码String location = parts[1].trim(); // 第二部分作为地区名称codeToLocationHashOps.put(CODE_TO_LOCATION_KEY, code, location);locationToCodeHashOps.put(LOCATION_TO_CODE_KEY, location, code);count++; // 每存储一条数据,计数器加一}}log.info("存在地区数据{}条",count);} catch (IOException e) {e.printStackTrace();}} else {log.info("地区数据已缓存 无需加载");}}// 获取文件行数,用于检查是否拥有所有数据private int countLines(String filePath) {int count = 0;try (BufferedReader reader = new BufferedReader(new FileReader(filePath))) {while (reader.readLine() != null) count++;} catch (IOException e) {e.printStackTrace();}return count;}}

通过code码获取对应地点名称 及相反  工具类

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.HashOperations;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;@Component
public class LocationUtil {@Autowiredprivate RedisTemplate<String, String> redisTemplate;private static final String CODE_TO_LOCATION_KEY = "LocationByCode"; // Redis Hash 的键private static final String LOCATION_TO_CODE_KEY = "CodeByLocation"; // Redis Hash 的键// 获取 code 对应的地区public String getLocationByCode(String code) {HashOperations<String, String, String> hashOps = redisTemplate.opsForHash();return hashOps.get(CODE_TO_LOCATION_KEY, code);}// 获取地区对应的 codepublic String getCodeByLocation(String location) {HashOperations<String, String, String> hashOps = redisTemplate.opsForHash();return hashOps.get(LOCATION_TO_CODE_KEY, location);}
}

测试


@SpringBootTest
public class demo {@Resourceprivate LocationUtil locationUtil;@Testpublic void test1(){String location = locationUtil.getCodeByLocation("东城区");System.out.println(location);String locationByCode = locationUtil.getLocationByCode("710001");System.out.println(locationByCode);}
}

8da6fa36ed9a459ba14d2c708133a718.png

 

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

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

相关文章

Java 泛型基础

目录 1. 为什么使用泛型 2. 泛型的使用方式 2.1. 泛型类 2.2. 泛型接口 2.3. 泛型方法 3. 泛型涉及的符号 3.1. 类型通配符"?" 3.2. 占位符 T/K/V/E 3.3. 占位符T和通配符&#xff1f;的区别。 4. 泛型不变性 5. 泛型编译时擦除 1. 为什么使用泛型 Java 为…

基于深度学习的入侵检测系统综述文献概述

好长时间不发博客了&#xff0c;不是因为我摆烂了&#xff0c;是我换研究方向了&#xff0c;以后我就要搞科研了。使用博客记录我的科研故事&#xff0c;邀诸君共同见证我的科研之路。 1、研究方向的背景是什么&#xff1f; &#xff08;1&#xff09;互联网发展迅速&#xff…

基于ssm的蛋糕商城系统java项目jsp项目javaweb

文章目录 蛋糕商城系统一、项目演示二、项目介绍三、系统部分功能截图四、部分代码展示五、底部获取项目源码&#xff08;9.9&#xffe5;带走&#xff09; 蛋糕商城系统 一、项目演示 蛋糕商城管理系统 二、项目介绍 系统角色 : 管理员、用户 一&#xff0c;管理员 管理员有…

Mixed-precision计算原理(FP32+FP16)

原文&#xff1a; https://lightning.ai/pages/community/tutorial/accelerating-large-language-models-with-mixed-precision-techniques/ This approach allows for efficient training while maintaining the accuracy and stability of the neural network. In more det…

【排序算法】选择排序以及需要注意的问题

选择排序的基本思想&#xff1a;每一次从待排序的数据元素中选出最小&#xff08;或最大&#xff09;的一个元素&#xff0c;存放在序列的起始位置&#xff0c;直到全部待排序的数据元素排完 。 第一种实现方法&#xff1a; void SelectSort(int* arr, int n) {for (int j 0…

【kubernetes】探索k8s集群中金丝雀发布后续 + 声明式资源管理yaml

目录 一、K8S常见的发布方式 1.1蓝绿发布 1.2灰度发布&#xff08;金丝雀发布&#xff09; 1.3滚动发布 二、金丝雀发布 三、声明式管理方法 3.1YAML 语法格式 3.1.1查看 api 资源版本标签 3.1.2查看资源简写 3.2YAML文件详解 3.2.1Deployment.yaml 3.2.2Pod.yaml …

C++系列-C/C++内存管理方式

&#x1f308;个人主页&#xff1a;羽晨同学 &#x1f4ab;个人格言:“成为自己未来的主人~” C/C内存分布 在这篇文章开始之前&#xff0c;我们先以一道题目来进行引入&#xff1a; int glovalvar 1; static int staticGlovalvar 1; void Test() {static int staticva…

Java进阶学习笔记27——StringBuilder、StringBuffer

StringBuilder&#xff1a; StringBuilder代表可变字符串对象&#xff0c;相当于一个容器&#xff0c;它里面装的字符串是可以改变的&#xff0c;就是用来操作字符串的。 好处&#xff1a; StringBuilder比String更适合做字符串的修改操作&#xff0c;效率会更高&#xff0c;…

在CSDN上成长的感悟,你的粉丝长啥样?

文章目录 一、写作的初衷1. 记录所学内容2.巩固所学知识3.分享与帮助4.方便后续查找5.获取激励 二、你的粉丝长啥样&#xff1f;1. 粉丝的特点与困惑2. 关于粉丝&#xff0c;细思极恐 三、继续前行、坚持初心 在CSDN上写博文&#xff0c;对于我来说&#xff0c;不仅仅是一个记录…

OTA在线旅行社系统架构:连接世界的科技纽带

随着互联网的快速发展和人们对旅行需求的不断增长&#xff0c;OTA&#xff08;Online Travel Agency&#xff09;在线旅行社成为了现代旅行业中的重要一环。OTA系统架构的设计和实现将对旅行行业产生深远影响。本文将探讨OTA在线旅行社系统架构的重要性和关键组成部分&#xff…

Java筑基(三)

Java筑基&#xff08;三&#xff09; 一、final概念1、案例1&#xff1a;采用继承&#xff1a;2、案例2&#xff1a;final修饰的类不可以被继承&#xff1a;3、案例3&#xff1a;final修饰的类不能有子类&#xff0c;但是可以有父类4、final修饰构造方法5、final修饰普通方法6、…

渗透工具CobaltStrike工具的下载和安装

一、CobalStrike简介 Cobalt Strike(简称为CS)是一款基于java的渗透测试工具&#xff0c;专业的团队作战的渗透测试工具。CS使用了C/S架构&#xff0c;它分为客户端(Client)和服务端(Server)&#xff0c;服务端只要一个&#xff0c;客户端可有多个&#xff0c;多人连接服务端后…

音视频开发8 音视频中SDL的使用,SDL 在windows上环境搭建,SDL 使用 以及 常用 API说明,show YUV and play PCM

1.SDL简介 SDL&#xff08;Simple DirectMedia Layer&#xff09;&#xff0c;是一个跨平台的C语言多媒体开发库。 支持Windows、Mac OS X、Linux、iOS、Android 提供对音频、键盘、鼠标、游戏操纵杆、图形硬件的底层访问 很多的视频播放软件、模拟器、受欢迎的游戏都在使用…

面试中算法(A星寻路算法)

一、问题需求&#xff1a; 迷宫寻路游戏中&#xff0c;有一些小怪物要攻击主角&#xff0c;现在希望你给这些小怪物加上聪 明的AI (Artificial Intelligence&#xff0c;人工智能&#xff09;&#xff0c;让它们可以自动绕过迷宫中的障碍物&#xff0c;寻找到主角的所在。 A星…

json web token及JWT学习与探索

JSON Web Token&#xff08;缩写 JWT&#xff09;是目前最流行的跨域认证解决方案 作用&#xff1a; 主要是做鉴权用的登录之后存储用户信息 生成得token(令牌)如下 eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MSwiaWF0IjoxNjg3Njc0NDkyLCJleHAiOjE2ODc3NjA4OTJ9.Y6eFG…

1107 老鼠爱大米

solution 记录每组的最大值&#xff0c;并比较组间的最大值胖胖鼠~ #include<iostream> using namespace std; int main(){int n, m, ans, fat -1, x;scanf("%d%d", &n, &m);for(int i 0; i < n; i){ans -1;for(int j 0; j < m; j){scanf(…

【C/C++】Makefile文件的介绍与基本用法

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; &#x1f525;c系列专栏&#xff1a;C/C零基础到精通 &#x1f525; 给大…

【论文复现】LSTM长短记忆网络

LSTM 前言网络架构总线遗忘门记忆门记忆细胞输出门 模型定义单个LSTM神经元的定义LSTM层内结构的定义 模型训练模型评估代码细节LSTM层单元的首尾的处理配置Tensorflow的GPU版本 前言 LSTM作为经典模型&#xff0c;可以用来做语言模型&#xff0c;实现类似于语言模型的功能&am…

【Torch学习笔记】

作者&#xff1a;zjk 和 的区别是逐元素相乘&#xff0c;是矩阵相乘 cat stack 的区别 cat stack 是用于沿新维度将多个张量堆叠在一起的函数。它要求所有输入张量具有相同的形状&#xff0c;并在指定的新维度上进行堆叠。

【NumPy】关于numpy.mean()函数,看这一篇文章就够了

&#x1f9d1; 博主简介&#xff1a;阿里巴巴嵌入式技术专家&#xff0c;深耕嵌入式人工智能领域&#xff0c;具备多年的嵌入式硬件产品研发管理经验。 &#x1f4d2; 博客介绍&#xff1a;分享嵌入式开发领域的相关知识、经验、思考和感悟&#xff0c;欢迎关注。提供嵌入式方向…