使用java,生成不带指定数字的序号

欧阳葵 发布于 2013/05/06 15:25
阅读 663
收藏 0

场景如下:

 一般的订单号是有规则的如:170081300002760 其中红色部分是使用seq生成的。

现在有一个需求要求红色部分生产的数字当中不能带4这个数字,请问大家有没有好的方法?

现在能想到的方式如下:

每次生成一个序号后判断其中的数字是否为4,如果为4则根据这个数字所在的位数来决定增加多少数,重复上面的步骤,直到所有数字不含4为止。

但问题是如何通过代码的方式(Java)让seq一次增加上百或上千的值?


加载中
0
明月照大江
明月照大江

序号是顺序递增的,从小开始到大生成的么


0
欧阳葵
欧阳葵

引用来自“明月照大江”的答案

序号是顺序递增的,从小开始到大生成的么


对的,每次都是重小的开始
0
逝水fox
逝水fox
0~9排开4的char[] 按9进制取对应位置元素生成String就可以了吧...
0
明月照大江
明月照大江
跟上面的一样,使用9进制来解决这个问题,9进制包含了 0 1 2 3 5 6 7 8 9.个符号。至于实现,你可以继续使用int值的递增来获取数,生成的时候一直除以9,就像 十进制转二进制一样,这样可以得到一个九进制的数,范围在0-8之间,在除的过程中,将4以上的数映射到char为 该值+1的数值表示上,就可以得到你想要的数字了
0
欧阳葵
欧阳葵

引用来自“明月照大江”的答案

跟上面的一样,使用9进制来解决这个问题,9进制包含了 0 1 2 3 5 6 7 8 9.个符号。至于实现,你可以继续使用int值的递增来获取数,生成的时候一直除以9,就像 十进制转二进制一样,这样可以得到一个九进制的数,范围在0-8之间,在除的过程中,将4以上的数映射到char为 该值+1的数值表示上,就可以得到你想要的数字了

您说的这种方式应该只是限于用程序去实现吧?我知道如果用程序实现的话这样处理确实是一种办法,但是我要考虑并发(多台应用服务器)的情况下生成的序号要唯一,所以目前使用的是oracle的seq实现。


明月照大江
明月照大江
回复 @欧阳葵 : 肯定是唯一的啊,进制只是数字的进位方式而已,10进制是缝10进位,二进制 是缝2进位,9进制就是缝9进位
欧阳葵
欧阳葵
回复 @明月照大江 : 意识是说,我先用数据库的seq生成一个10进制的数字如:54321,然后再将这个数字使用9进制转换一下? 我想确认一下如果我的10进制数字是唯一的,那这个9进制是否也是唯一的?
明月照大江
明月照大江
唯一性来自一个专门生成id的服务器或者来自数据库都可以,数据库生成的id肯定是10进制,你可以在表中再加一个字段,就是存储id转成9进制后的字符串,这个也是办法中的一个,我对oracle不熟,但是目前用程序的代码来生成是一个可以实施的办法。
0
这个昵称应该没有人用
这个昵称应该没有人用

引用楼主:如何通过代码的方式(Java)让seq一次增加上百或上千的值?

如果安这个思路做,你没有必要一次加上百上千,这样你还要判断4在哪些位.

可以把红色部分当字符串处理,把4替换成你要改的数字即可.

这个昵称应该没有人用
这个昵称应该没有人用
回复 @欧阳葵 : 我是针对你"怎么加"的问题,没有针对整个问题,加也会重复的.按照你的描述,看看能不能在seq生成的时候想办法,不然怎么处理都会重复,因为seq只要是连续的,改成哪个都有可能重复.
欧阳葵
欧阳葵
不能直接替换的,如果直接替换就有可能数字重复了。 如刚开始的序列是4321,假设我将4更改成5后,一旦我的序列增长到54321的时候,就和之前的数字冲突了。
0
欧阳葵
欧阳葵

引用来自“明月照大江”的答案

跟上面的一样,使用9进制来解决这个问题,9进制包含了 0 1 2 3 5 6 7 8 9.个符号。至于实现,你可以继续使用int值的递增来获取数,生成的时候一直除以9,就像 十进制转二进制一样,这样可以得到一个九进制的数,范围在0-8之间,在除的过程中,将4以上的数映射到char为 该值+1的数值表示上,就可以得到你想要的数字了

非常感谢这位兄弟,问题基本解决了。

思路大致如下,原有的序号生成方式保持不变,这样可以保证序号的唯一性。

对原有的序号做9进制处理,这个9进制是自己定义的9为数(其实也可以用一下字符啊什么的),其中的数字4去除掉。

python代码如下:

#!/usr/bin/python
# Filename:policyCode.py

def createCode(num):
    str = ["0","1","2","3","5","6","7","8","9"]
    result = []
    str2 =""
    isRunning = True
    while isRunning:
        n = num%9
        #print str[n],
        result.append(str[n])
        num = num/9
        if num <=0:
            isRunning = False
    else: 
        r = result[::-1]  #sort list by desc    
        #print r
        for item in r:
            str2+=item
    return str2

for i in range(0,999):
    f = file('list.txt','a') # append str to file 
    str = createCode(i)
    f.write(str+"\n")
    f.close()
print 'DONE.'

生成的数字示例如下:

十进制,9进制:

1 == 0

2 == 1

3 == 2

4 == 3

5 == 5

6 == 6

7 == 7

8 == 8

9 == 9

....


82 == 100

83 == 101

返回顶部
顶部