快递地址归类排序实现(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号
深圳市:
广东省深圳市南山区科技园街道科技南一路1号浙江省:
杭州市:
浙江省杭州市西湖区文三路100号