关于自定义流水码的实现

关于自定义流水码的实现最近有碰到用户提出流水码中不能包含 4 的需求 原本的想法是正常做十进制的流水码 然后碰到 4 就跳过 然后重新请求 后面想一想 这么做比较 low 而且万一后面用户再提些奇奇怪怪的需求 不要 1 不要 2 啥的 再想了想之前接触过的系统中是支持自定义流水码的

大家好,我是讯享网,很高兴认识大家。

最近有碰到用户提出流水码中不能包含4的需求,原本的想法是正常做十进制的流水码,然后碰到4就跳过,然后重新请求。后面想一想,这么做比较low,而且万一后面用户再提些奇奇怪怪的需求,不要1,不要2啥的,再想了想之前接触过的系统中是支持自定义流水码的,不包含4的这个需求,只需要在自定义中定义流水码为【0,1,2,3,5,6,7,8,9】就可以了,所以开发一个通用的自定义流水码生成功能。

整个思路很简单,就是写一个方法,输入请求的流水,转换成对应自定义的流水码,然后输出。

想法很简单,实现起来用了几个小时,主要是在草稿纸上的花费。

下面先给实现逻辑。

首先我们需要知道,流水码需要生成多少位,因为这个参数会关系到我们返回多少位的流水码,位数不足的话就需要补零(这是最原始的想法,后面再优化之后发现不需要补零)。

然后我们要知道我们需要转换的序号,比如我们要把100转成?,或者把2222转成?,一般我们要流水码都会按序号来,比如100~999,请求900个这种,在我们这种方式下实现,需要先循环起来,把每次的序号传方法进行转换。

最后我们需要知道自定义流水码的内容,即定义了哪些字符作为流水码。

然后是最为精彩的部分,我们实现起来,先从个位开始生成(即右手边第一位)然后逐位生成拼接,注意我们的流水码中是可能有字符的,所以不能用我们以前理解的a*100+b*10+c这种方式,只能用字符串拼接。这里我用一个循环来实现。先上代码吧。

public static string GetCustomSeq(int count,int seq,string[] customSeq)         {             //这段逻辑太绕了,代码简单,但逻辑特别绕,大致思路为,从右手边第一位开始,逐位计算后拼接到一起             //参考以下公式进行理解             //通用公式             //流水码【流水码序号/自定义流水码的个数^(位数-1)%自定义流水码的个数】             string result =null;             //string[] customSeq = ;             string gongshi = null;             for (int i = 0; i < count; i++)             {                                 gongshi = customSeq[seq / Convert.ToInt32( Math.Pow(customSeq.Length, i))% customSeq.Length] + gongshi;             }             result = gongshi;             return result;         }

讯享网

核心代码就一行,推导出这个结果却花了几个小时,最后的公式就是这样【流水码序号/自定义流水码的个数^(位数-1)%自定义流水码的个数】,推导的方式就是找规律(请叫我学渣)。这里有个小提示 / 除法操作,当分子分母都为整数时,结果为取整,即30/7=4。推导过程不讲了,也讲不清楚,自己都不知道为啥这么推。下面举个例子讲解。

定义,本次需要输出6位流水码,

流水码区间为80-81(两个就可以看出逻辑,不需要太多)

自定义流水码内容,就按照我们这个需求来,不要4的流水码{0,1,2,3,5,6,7,8,9},按照数组来理解

OK,验证过程,当流水码为80时

第一位 = 流水码[80/9^(1-1)%9] (先算9^(1-1)=1,然后80/1=80,然后80%9=8)=流水码[8]=9


讯享网

第二位 = 流水码[80/9^(2-1)%9](先算9^(2-1)=9,然后80/9=8,然后8%9=8)=流水码[8]=9

第三位 = 流水码[80/9^(3-1)%9](先算9^(3-1)=81,然后80/81=0,然后0%9=0)=流水码[0]=0

......(和第三位类似,不写了,都是0)

最后结果000099

当流水码为81时

第一位 = 流水码[81/9^(1-1)%9] (先算9^(1-1)=1,然后81/1=81,然后81%9=0)=流水码[0]=0

第二位 = 流水码[81/9^(2-1)%9](先算9^(2-1)=9,然后81/9=9,然后9%9=0)=流水码[0]=0

第三位 = 流水码[81/9^(3-1)%9](先算9^(3-1)=81,然后81/81=1,然后1%9=1)=流水码[1]=1

第四位= 流水码[81/9^(4-1)%9](先算9^(4-1)=81,然后81/729=0,然后0%9=0)=流水码[0]=0

......(和第四位类似,不写了,都是0)

最后结果000100

以上例子已经可以很直观的表明流水码创建的过程,公式和使用场景肯定还有很多可以优化的地方,但对于我的此次需求来说已经足够了,后续有好想法也会持续优化。

 

小讯
上一篇 2025-03-31 13:22
下一篇 2025-03-30 19:16

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/48533.html