栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

巧用javascript和c#查找不连号号的号码

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

巧用javascript和c#查找不连号号的号码

业务背景:
航空货运系统中,“货运代理商”会定期从“航空公司”领取一定数量的纸质运单(每张纸上有一个单号),这些单号都是连续的(即:每次可以理解为领取一个“号段”),而且每张单子都要向航空公司交纳一定的费用(即:单号是有价的资产)。

实际使用中,货运代理商希望下级的各营业点连续把单号用完,如果出现未连续使用的情况(即:所谓的跳号),要求快速找出来,给予提醒,提示用户优先使用跳号的运单。(否则这些运单号,一直可能不被注意到,造成浪费,而且每到期末跟航空公司对账时,也对不清楚)

思路: 

A:

一个号段的号码,抽象成一个数组;每个号码的使用状态,也抽象成一个等长的数组(Y表示已使用,N表示未使用)

这样使用状态就可形成 类似 "YYYYNNYYNYNNN" 的字符串,只找正则表达式找到 "N...Y"的位置,即为跳号的位置(即:下标值),根据该位置,即可方便取出跳号的号码

B:

如果不使用正则表达式,直接双重循环,也可以查找到,若某一个元素为“N”,在它后面还有"Y",则表示该元素“被跳号”了

1 
 2 
 3             
 4         find SKip Number
 5         
 6     
 7     
 8         
 9         //号段的运单列表
10         var arrAwbNo = ['001','002','003','004','005','006','007','008','009','010'];
11         
12         //该号段的单号使用状态列表(Y已使用,N未使用)
13         var arrStatus =['Y',   'Y',  'N',  'N',  'Y',  'N',  'Y' , 'N',  'Y',  'N'];    
14 
15         //利用正则表达式查找
16         alert("正则表达式方法查找结果:" +  findSkipNumberA(arrAwbNo,arrStatus) );
17 
18         //利用循环直接查找
19         alert("双重循环查找结果:" + findSkipNumberB(arrAwbNo,arrStatus) );
20         
21         function findSkipNumberA(awbNos, awbStatus){
22             var status = awbStatus.join('');
23             var groups = status.match(/(N+Y)/ig);    //利用正则表达式找出 NY,NNY,...,N***Y的跳号部分    
24         
25             if (groups!=null){
26                 var gapIndex = [];
27                 //先找到跳号位置的下标索引
28                 for(var i = 0;i2){
39                         for(var j=1;j
71 

 C#的实现:

 1         static String[] findSkipNumberA(Regex reg, String[] awbNos, String awbStatus)
 2         {
 3             //Regex reg = new Regex("N+Y", RegexOptions.Compiled);
 4             List result = new List();
 5 
 6             MatchCollection matchs = reg.Matches(awbStatus);
 7 
 8             int findStartIndex = 0;
 9             foreach (Match m in matchs)
10             {
11                 String matchValue = m.Groups[0].Value;
12                 findStartIndex = awbStatus.IndexOf(matchValue, (findStartIndex > 0 ? findStartIndex + 1 : 0));
13                 for (int i = 0; i < matchValue.Length - 1; i++)
14                 {
15                     result.Add(awbNos[findStartIndex + i]);
16                 }
17 
18                 findStartIndex += (matchValue.Length - 1);//更新下次IndexOf查找的起始位置
19             }
20 
21             return result.ToArray();
22         }
23 
24         static String[] findSkipNumberB(String[] awbNos, String[] awbStatus)
25         {
26             List result = new List();
27             for (int i = 0; i < awbStatus.Length - 1; i++)
28             {
29                 for (int j = i + 1; j < awbStatus.Length; j++)
30                 {
31                     if (awbStatus[i] == "N" && awbStatus[j] == "Y")
32                     {
33                         result.Add(awbNos[i]);
34                         break;
35                     }
36                 }
37             }
38             return result.ToArray();
39         }

c#版实际测试下来,如果数组较大(>200),正则表达式方式优势明显;数组较小于时,手动双重循环更快

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/231766.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号