当前位置: 首页 > news >正文

快递地址归类排序实现(Java Python)

Java 实现

import java.util.*;
import java.util.regex.*;public class AddressProcessor {// 地址正则表达式(简化版,实际应用需要更复杂的正则)private static final Pattern ADDRESS_PATTERN = Pattern.compile("(?<province>[^省]+省|[^自治区]+自治区|[^市]+市)(?<city>[^市]+市|[^自治州]+自治州|[^区]+区|[^县]+县)(?<county>[^区]+区|[^县]+县|[^旗]+旗)?(?<town>[^镇]+镇|[^乡]+乡|[^街道]+街道)?(?<detail>.*)");public static void main(String[] args) {List<String> addresses = Arrays.asList("广东省深圳市南山区科技园街道科技南一路1号","浙江省杭州市西湖区文三路100号","北京市朝阳区建国门外大街1号","上海市浦东新区陆家嘴环路100号","广东省广州市天河区体育西路1号","江苏省南京市鼓楼区北京西路1号");// 解析并归类地址Map<String, Map<String, List<String>>> classifiedAddresses = classifyAddresses(addresses);// 打印归类结果printClassifiedAddresses(classifiedAddresses);}public static Map<String, Map<String, List<String>>> classifyAddresses(List<String> addresses) {Map<String, Map<String, List<String>>> result = new TreeMap<>();for (String address : addresses) {Matcher matcher = ADDRESS_PATTERN.matcher(address);if (matcher.find()) {String province = matcher.group("province");String city = matcher.group("city");// 确保省份存在if (!result.containsKey(province)) {result.put(province, new TreeMap<>());}// 确保城市存在if (!result.get(province).containsKey(city)) {result.get(province).put(city, new ArrayList<>());}// 添加地址到对应城市result.get(province).get(city).add(address);}}// 对每个城市的地址列表进行排序for (Map<String, List<String>> provinceMap : result.values()) {for (List<String> cityAddresses : provinceMap.values()) {Collections.sort(cityAddresses);}}return result;}public static void printClassifiedAddresses(Map<String, Map<String, List<String>>> classifiedAddresses) {for (Map.Entry<String, Map<String, List<String>>> provinceEntry : classifiedAddresses.entrySet()) {System.out.println(provinceEntry.getKey() + ":");for (Map.Entry<String, List<String>> cityEntry : provinceEntry.getValue().entrySet()) {System.out.println("  " + cityEntry.getKey() + ":");for (String address : cityEntry.getValue()) {System.out.println("    " + address);}}System.out.println();}}
}

Python 实现

import re
from collections import defaultdict# 地址正则表达式(简化版)
ADDRESS_PATTERN = re.compile(r'(?P<province>[^省]+省|[^自治区]+自治区|[^市]+市)'r'(?P<city>[^市]+市|[^自治州]+自治州|[^区]+区|[^县]+县)'r'(?P<county>[^区]+区|[^县]+县|[^旗]+旗)?'r'(?P<town>[^镇]+镇|[^乡]+乡|[^街道]+街道)?'r'(?P<detail>.*)'
)def classify_addresses(addresses):"""归类排序快递地址"""result = defaultdict(lambda: defaultdict(list))for address in addresses:match = ADDRESS_PATTERN.match(address)if match:province = match.group('province')city = match.group('city')# 添加到对应的省份和城市result[province][city].append(address)# 对结果进行排序sorted_result = {}for province in sorted(result.keys()):sorted_cities = {}for city in sorted(result[province].keys()):sorted_cities[city] = sorted(result[province][city])sorted_result[province] = sorted_citiesreturn sorted_resultdef print_classified_addresses(classified_addresses):"""打印归类后的地址"""for province, cities in classified_addresses.items():print(f"{province}:")for city, addresses in cities.items():print(f"  {city}:")for address in addresses:print(f"    {address}")print()if __name__ == "__main__":addresses = ["广东省深圳市南山区科技园街道科技南一路1号","浙江省杭州市西湖区文三路100号","北京市朝阳区建国门外大街1号","上海市浦东新区陆家嘴环路100号","广东省广州市天河区体育西路1号","江苏省南京市鼓楼区北京西路1号"]classified = classify_addresses(addresses)print_classified_addresses(classified)

说明

  1. 地址解析

    • 使用正则表达式解析地址中的省、市、区等信息

    • 实际应用中可能需要更复杂的正则表达式或专门的地址解析库

  2. 归类排序

    • 按省份归类

    • 每个省份下按城市归类

    • 每个城市下的地址按字母顺序排序

    • 扩展性

      • 可以添加更详细的地址解析(区、街道等)

      • 可以支持更多的排序方式(如按邮编、按距离等)

广东省:
广州市:
广东省广州市天河区体育西路1号
深圳市:
广东省深圳市南山区科技园街道科技南一路1号

浙江省:
杭州市:
浙江省杭州市西湖区文三路100号

http://www.dtcms.com/a/361227.html

相关文章:

  • Jenkins 自动构建Vue 项目的一个大坑
  • JVM核心机制:类加载与内存结构详解
  • OpenHarmony智能语音框架深度拆解:从VAD到唤醒词打造你的AI语音智能体
  • 自动化软件测试工具Parasoft C/C++test如何实现运行时错误的检测与修复
  • 面试经典150题[021]:反转字符串中的单词(LeetCode 151)
  • 【XR技术概念科普】VST(视频透视)vs OST(光学透视):解码MR头显的两种核心技术路径
  • 「数据获取」《中国住户调查年鉴》(2000-2024)(获取方式看绑定的资源)
  • SQLark:一款面向信创应用开发者的数据库开发和管理工具
  • Jmeter实现参数化的4种方式
  • Windows神器,按键屏蔽
  • 【机器学习学习笔记】pandas基础
  • (纯新手教学)计算机视觉(opencv)实战十二——模板匹配(cv2.matchTemplate)
  • UE角色取消被Decal影响
  • Jetson AGX Orin平台R36.3.0版本1080P25fps MIPI相机图像采集异常调试记录
  • 基于单片机电动车充电桩/充电车棚环境监测设计
  • 基于RS-485接口的芯片的FPGA驱动程序
  • 吴恩达机器学习作业十二:协同过滤(电影推荐系统)
  • 广电手机卡到底好不好?
  • Git基础使用和PR贡献
  • .Net程序员就业现状以及学习路线图(二)
  • Android面试指南(六)
  • 大模型落地全流程实践:从技术选型到企业级部署
  • 音视频开发入门:FFmpeg vs GStreamer,新手该如何选择?
  • 松灵斯坦福Mobile ALOHA同款 | 通过低成本全身远程操作实现双手机器人移动操控学习
  • 01数据结构-红黑树
  • 永磁同步电机无速度算法--高频脉振方波注入法(测量轴系转子位置误差信号解耦处理)
  • Spark引擎中RDD的性质
  • 【牛客JZ31】—栈的压入弹出序列判断算法详解
  • 【73页PPT】MES应用介绍(附下载方式)
  • SpringBoot @RefreshScope 注解的极致玩法