1.标准格式为 街道名称,起始门牌号,结束门牌号,单双号
客户输入名称 例:南苏州路1400号
结果:匹配到标准信息
可能出现情况,输入信息中有多个街道名称等 南苏州路xx路路口1400号

    @Overridepublic boolean gather() {//list 客户输入信息集//mapList 道路信息集//TT 信息实体类List<TT> newlist = ppjd(list, mapList);}private List<TT> ppjd(List<tt> list, List<Map> mapList) {List<TT> newlist = new ArrayList<>();for (int i = 0; i < list.size(); i++) {//将地址  拆分成 汉字和数字String verify = list.get(i);verify.replace(" ", "");//全部拆开List<String> lists = Stream.iterate(0, n -> ++n).limit(verify.length()).map(n -> "" + verify.charAt(n)).collect(Collectors.toList());//用来进行判断数字的String strNumbers = "0123456789";int length = 0;//定义索引下标String[] strs = new String[verify.length()];//再新建个数组,用来存放 当是连续数字时,把那个连续的数据当成一个数组boolean bool = true;//遍历拆开的字符串for (String str : lists) {int index = strNumbers.indexOf(str);if (index == -1) {//表示当前值不是数字strs[length] = str;//直接把当前的值 赋值 给  数组length++;//索引下标 自增bool = true; // 锁开启} else {//表示当前值是数字if (bool) {strs[length] = str;length++;
//                        sumInteter++;bool = false;//锁关闭,使锁关闭的原因是当下一个字符是 也数字是运行下面else的操作} else {  //当前值和前一个值也是数字, 就运行这步//因为之前的索引自增了, 索引必须要-1  ,使用concat把数字链接到前一个值的尾部strs[length - 1] = strs[length - 1].concat(str);}}}//存放门牌号int mp = -1;for (String str : strs) {if (str != null) {if (str.matches("\\d+")) {//纯数字mp = Integer.parseInt(str);break;}}}//拆解 手写地址,和标准地址 进行比对//存放包含的 标准地址对象List<Map> mapList1 = new ArrayList<>();
//            //存放不包含的 数据对象
//            List<TT> ttlist2 = new ArrayList<>();//是否匹配到社区boolean ppd = false;//是否匹配成功Fttboolean ppcg = false;for (int j = 0; j < mapList.size(); j++) {//将街道拆开String jd = mapList.get(j).get("街道名称").toString();jd.replace(" ", "");List<String> jdList = Stream.iterate(0, n -> ++n).limit(jd.length()).map(n -> "" + jd.charAt(n)).collect(Collectors.toList());//会出现一个地址中 有两个地址字段  例:新闸路石门二路口地面停车场内if (lists.containsAll(jdList)) {mapList1.add(mapList.get(j));ppd = true;}}//匹配到 社区if (ppd) {for (Map map : mapList1) {map.get("");//手写数据门牌号单双
//                    单号if (mp != -1 && mp % 2 != 0 && "0".equals(map.get("单双号").toString())) {if (Integer.parseInt(map.get("起始门牌号").toString()) <= mp && mp <= Integer.parseInt(map.get("结束门牌号").toString())) {list.get(i).setCommitteeId(map.get("居委会ID").toString());list.get(i).setRoadId(map.get("街道ID").toString());newlist.add(list.get(i));ppcg = true;break;}}}//没有门牌号 或者匹配失败,就确定居委会if (!ppcg) {//重名截取前四个进行比对  新闸路成都北路口   匹配成功跳出for (int cs = 0; cs < verify.length() - 4; cs++) {boolean cc = false;for (Map map : mapList1) {if (verify.substring(cs, cs+4).indexOf(map.get("街道名称").toString().replace(" ", "")) != -1) {if (StringUtils.isNotEmpty(map.get("居委会ID").toString()) && StringUtils.isNotEmpty(map.get("街道ID").toString())) {list.get(i).setCommitteeId(map.get("居委会ID").toString());list.get(i).setRoadId(map.get("街道ID").toString());newlist.add(list.get(i));cc = true;break;}}}if(cc){break;}}//                    list.get(i).setCommitteeId(mapList1.get(0).get("居委会ID").toString());
//                    list.get(i).setRoadId(mapList1.get(0).get("街道ID").toString());
//                    newlist.add(list.get(i));}
//                return newlist;} else {for (int cs = 0; cs < verify.length() - 4; cs++) {TT tt = cfpp(list.get(i), mapList, verify, newlist, cs, mp);if (StringUtils.isNotEmpty(tt.getRoadId()) ) {newlist.add(tt);break;}}}}return newlist;}private TT cfpp(TT tt, List<Map> mapList, String verify, List<TT> newlist, int cs, int mp) {// 1.截取0-4直接判断 改地址中 是否包含标准地址库地址//存放居委会能匹配到的数据List<Map> newlistmap = new ArrayList<>();boolean cg = false;for (int j = 0; j < mapList.size(); j++) {String jd = mapList.get(j).get("街道名称").toString();if (verify.substring(cs, cs + 4).indexOf(jd) != -1) {//包含 是否包含门牌//有门牌if (mp != -1 && Integer.parseInt(mapList.get(j).get("起始门牌号").toString()) <= mp && mp <= Integer.parseInt(mapList.get(j).get("结束门牌号").toString())) {tt.setCommitteeId(mapList.get(j).get("居委会ID").toString());tt.setRoadId(mapList.get(j).get("街道ID").toString());break;}newlistmap.add(mapList.get(j));}}//没有门牌号能匹配到居委会   (都匹配不到就舍弃)if (!cg && newlistmap.size() > 0) {tt.setCommitteeId(newlistmap.get(0).get("居委会ID").toString());tt.setRoadId(newlistmap.get(0).get("街道ID").toString());}return tt;}

Java 字符串匹配算法道路匹配相关推荐

  1. Java字符串匹配算法

    定义 串(string)是由零个或多个字符组成的有限序列又名叫字符串. 一般地,由n个字符串构成的串记作: S="a0a1-an-1"(n≥0),其中a_i(1≤i≤n) n是个有 ...

  2. Java字符串相似度匹配

    原文:http://wdhdmx.iteye.com/blog/1343856#bc2319361 package com.xfl.boot.common.utils;/*** Created by ...

  3. Java字符串的处理

    文章目录 本章学习要点 Java定义字符串(2种方式) 直接定义字符串 例 1 使用 String 类定义 1. String() 2. String(String original) 3. Stri ...

  4. 字符串匹配算法(BF算法KMP算法)

    字符串匹配算法 暴力匹配(BF)算法 KMP算法 next数组 求next数组的练习 next数组的优化(nextval数组) 练习 暴力匹配(BF)算法 BF算法,即暴力(Brute Force)算 ...

  5. java 模式匹配算法_用Java匹配模式

    java 模式匹配算法 如果您使用的是Java,那么您很有可能以前已经看过它的模式匹配. String#matches(String)方法在内部使用Pattern类型,该类型包含更复杂的功能: 通过编 ...

  6. java中字符串的精确匹配_Java最佳实践–字符串性能和精确字符串匹配

    java中字符串的精确匹配 在使用Java编程语言时,我们将继续讨论与建议的实践有关的系列文章,我们将讨论String性能调优. 我们将专注于如何有效地处理字符串创建, 字符串更改和字符串匹配操作. ...

  7. java 字符串匹配_多模字符串匹配算法原理及Java实现代码

    多模字符串匹配算法在这里指的是在一个字符串中寻找多个模式字符字串的问题.一般来说,给出一个长字符串和很多短模式字符串,如何最快最省的求出哪些模式字符串出现在长字符串中是我们所要思考的.该算法广泛应用于 ...

  8. 使用Java实现高效的字符串匹配算法

    摘要:字符串匹配是计算机领域中的一个重要问题,有着广泛的应用场景.在本篇博客文章中,我们将介绍几种高效的字符串匹配算法,并给出使用Java语言实现的代码示例,希望能对读者理解和应用这些算法有所帮助. ...

  9. Java实现算法导论中KMP字符串匹配算法

    "前缀"和"后缀". "前缀"指除了最后一个字符以外,一个字符串的全部头部组合:"后缀"指除了第一个字符以外,一个字符串 ...

最新文章

  1. 面向连接的Socket Server的简单实现
  2. [POJ 1222] EXTENDED LIGHTS OUT
  3. 二项分布和Beta分布
  4. Main函数参数argc,argv如何传入
  5. 移动端web开发技巧
  6. python解决高并发的方法
  7. 合作式智能运输系统 车用通信系统应用层及应用数据交互标准 第二阶段_为什么一定要了解OPC UA TSN——未来的工业通信标准...
  8. rgb灯板Android程序,【图片】RGBW智能小夜灯程序则最近搞这玩意硬件真难搞【技术宅吧】_百度贴吧...
  9. Wiz.Editor.md 为知笔记 Markdown 插件
  10. InstallShield软件详解
  11. 2021年7月程序员工资统计,平均15302元
  12. 将文本保存为TXT文档
  13. h3c 云服务器操作系统,H3C云服务器安装系统的前期准备
  14. 计算机桌面摆桃心,怎样把桌面的图标摆成爱心形状的?(要图片)?
  15. vue与C#实现自定义表单审批流程构建-后端
  16. 开源中最好的Web开发资源汇总
  17. 和绅的女人们——汉人、黑人、白人、还有他的“干”女儿
  18. day 86 Vue学习之五DIY脚手架、webpack使用、vue-cli的使用、element-ui
  19. TX2--wifi模块开启AP路由功能
  20. JavaScriptMVC之View

热门文章

  1. 计算机我的文档data,将Win7用户文件夹(“我的文档”)的默认位置移至D_IT / Computer_Professional Inform...
  2. div垂直居中的两种方法
  3. Postgresql_存储过程:Update完返回操作数
  4. 物联网 实验2 Mind+ 掌控板
  5. 计蒜客2020蓝桥杯大学A组模拟赛题解
  6. Java“求从1到10的阶乘的和”
  7. Python使用BeautifulSoup4修改网页内容实战
  8. emacs阅读linux代码,Emacs - 代码编辑神器之一
  9. Windows系统升级node.js版本
  10. SpringBoot 基于RequestBodyAdvice 和 ResponseBodyAdvice 实现数据的加/解密(采用 RSA 算法 ),“船新版本”!