日期:2014-05-20  浏览次数:20683 次

这个文件编码规则怎么搞?
    现在需要设计一个文件编码规则,起始值为A00A,当再次编码的时候变为A00B,然后一直这样到A00Z,跳到A0AA,然后是A0AB这样一直到A0AZ,然后是A0BA,就这样到A0BZ,最后的值为ZZZZ,然后任何一位都不能使I、O、X,就是哦了A00H的时候,跳过AOOI,到AOOJ, 就是这样,这个真不会,有一点,起始值中的是零不是O,求帮!!!
------解决方案--------------------

你的看着有点晕,自己写了个,main里面全是测试用的代码,方法是increase(String str)这个,传一个当前的进去,返回一个增大1的,目测没有问题....

public class ReaderTest {
private static final char[] bits = new char[24];

static{
bits[0] = '0';
int index = 1;
for(int i = 0; i < 26; i ++){
char c = (char) ('A' + i);
if(c != 'I' && c != 'O' && c != 'X')
bits[index ++] = c;
}
}

private static String increase(String str){
char[] charArray = str.toCharArray();
for(int i = 0; i < charArray.length; i ++){
int posInArray = charArray.length - 1 - i;
int pos = getPosInBits(charArray[posInArray]);
if(pos + 1 >= bits.length)
charArray[posInArray] = '0';
else{
charArray[posInArray] = bits[pos + 1];
break;
}
}
return new String(charArray);
}

private static int getPosInBits(char c){
for(int i = 0; i < bits.length; i ++){
if(bits[i] == c)
return i;
}
return -1;
}

public static void main(String[] args) throws IOException {
for(int i = 0; i < 100; i ++){
char[] randomChar = new char[4];
for(int j = 0; j < randomChar.length; j ++)
randomChar[j] = bits[(int) (Math.random() * bits.length)];
String targetString = new String(randomChar);
System.out.println("[" + targetString + "] increate 1 to :[" + increase(targetString)+ "]");
}
}
}



------解决方案--------------------
将0A-Z 的24个字符作为字符放入一个字符数组当中,
每次变化,可以认为是24进制的加法运算.

public class Test {

private char[] store = new char[] { '0', 'A', 'B', 'C', 'D', 'E', 'F', 'G',
'H',  'J', 'K', 'L', 'M', 'N', 'P', 'Q', 'R', 'S', 'T',
'U', 'V', 'W', 'Y', 'Z' };

private int[] nums ;

public Test(String value){
init(value);
}

private void init(String value){
char[] tmp = value.toCharArray();
nums = new int[tmp.length];
int i = tmp.length-1;
for(char ch:tmp){
nums[i--]=find(ch);
}
}

private int find(char ch){
return find(ch,0,store.length);
}

private int find(char ch,int low,int hight){
int mid = (low+hight)/2;
if(ch==store[mid])
return mid;
if(ch<store[mid]){
return find(ch,low,mid);
}else{
return find(ch,mid,hight);