求一字符转化的算法

问题大致是这样的,把当前的时间毫秒数转化成一个7个字符的字符串,与时间一一对应的,此字符串包括数字和字母,最好是一种可逆的算法。。

final static char[] digits = {
'0' , '1' , '2' , '3' , '4' , '5' ,
'6' , '7' , '8' , '9' , 'a' , 'b' ,
'c' , 'd' , 'e' , 'f' , 'g' , 'h' ,
'i' , 'j' , 'k' , 'l' , 'm' , 'n' ,
'o' , 'p' , 'q' , 'r' , 's' , 't' ,
'u' , 'v' , 'w' , 'x' , 'y' , 'z' ,
'A' , 'B' , 'C' , 'D' , 'E' , 'F' ,
'G' , 'H' , 'I' , 'J' , 'K' , 'L' ,
'M' , 'N' , 'O' , 'P' , 'Q' , 'R' ,
'S' , 'T' , 'U' , 'V' , 'W' , 'X' ,
'Y' , 'Z'
};

private static String to62String(long i, int radix) {
if (radix < Character.MIN_RADIX || radix > 62)
radix = 10;
if (radix == 10)
return String.valueOf(i);
char[] buf = new char[65];
int charPos = 64;
boolean negative = (i < 0);
if (!negative) {
i = -i;
}
while (i <= -radix) {
buf[charPos--] = digits[(int)(-(i % radix))];
i = i / radix;
}
buf[charPos] = digits[(int)(-i)];
if (negative) {
buf[--charPos] = '-';
}
return new String(buf, charPos, (65 - charPos));
}

可以考虑进制的转换,十进制毫秒表示位数肯定已经超过七位,可以转换为十六进制的,十六进制的也可以再转为十进制的,这个是可逆的。
如果觉得十六进制的也不够用的话,就自己弄一个进制,比如0-9和26个字母组合起来的36进制的,和十六进制类似表示。
你只需写个进制转换的方法就可以了。

首先特点: 时间的毫秒数是少于或者等于14位的暂时不会超过。

开始做:
举例: 如果时间为: 1458201254752 (13位)

  1. 补全14位,那么前补0 为 01458201254752
  2. 你需要7位字符串,那么用14位分隔成7部分 : 01,45,82,01,25,47,52
  3. 使用一种策略来将两位数字转换成一个字符,你会想到什么? 矩阵嘛

    0 1 2 3 4 5 6 7 8 9
    0 @
    1 # a b c d e f g h j
    2 % A B C D E F G H I
    3 & o p q r s t u v w
    4 * O P Q R S T U V W
    5 ..............
    6
    7
    8
    9

这样 01 取得 @

这样取得7位字符组合成一个字符串即可。

[quote]
好思路,但是填补矩阵的字符不够啊
[/quote]

26个英文字母, 大小写一共是 52个

数字式10个,共62个,
在加上#$@!乱其八糟的字符凑成81个不难吧,再说了还有中文字符呢,字符是从1~127个课件字符啊

[quote]首先特点: 时间的毫秒数是少于或者等于14位的暂时不会超过。

开始做:
举例: 如果时间为: 1458201254752 (13位)

  1. 补全14位,那么前补0 为 01458201254752
  2. 你需要7位字符串,那么用14位分隔成7部分 : 01,45,82,01,25,47,52
  3. 使用一种策略来将两位数字转换成一个字符,你会想到什么? 矩阵嘛

    0 1 2 3 4 5 6 7 8 9
    0 @
    1 # a b c d e f g h j
    2 % A B C D E F G H I
    3 & o p q r s t u v w
    4 * O P Q R S T U V W
    5 ..............
    6
    7
    8
    9

这样 01 取得 @

这样取得7位字符组合成一个字符串即可。[/quote]
这确实是一种策略,但有失灵活,超过14位改怎么处理,15位,16位呢。其次,如果转换后也有比较大小的需要呢,这样就不能很好的比较了。而且矩阵实现起来比较负责,算法时间空间都不是很好。

可以考虑把年月日 去掉,只保留时分秒。这样位数应该够了。

[quote]
好思路,但是填补矩阵的字符不够啊
[/quote]

由于00~09可以换成单位的 0~9,所有需要 8*9 = 72个字符,现有的只有62个字符,缺少10个,如果不能用符号,你只能想办法把一些特殊情况来缩减字符个数。