将字母数字转换为ascii并递增

时间:2009-09-05 11:43:24

标签: java ascii

我很难理解如何将3个字母和3个数字转换为ascii并将它们递增1 ...这是旧的下一个牌照问题。任何人都可以给我一个正确的方向吗?

7 个答案:

答案 0 :(得分:2)

这个问题实际上有真正的应用。我写了一个像这样工作的帐号生成器。我将其修改为您的格式。你去吧,

public class LicenseNumber {

    int numericSum;
    int letterSum;

    public LicenseNumber() {
        numericSum = letterSum = 0;
    }

    public LicenseNumber(String number) {
        if (!number.matches("^[A-Za-z]{3}[0-9]{3}$"))
            throw new IllegalArgumentException("Number doesn't match license format");
        numericSum = Integer.valueOf(number.substring(3));
        letterSum = value(number, 0) * 26 * 26 + value(number, 1) * 26 + 
           value(number, 2);
    }

    public void increment() {
        increment(1);
    }

    public void increment(int inc) {
        numericSum += inc;
        if (numericSum >= 1000) {
            letterSum += numericSum/1000;
            numericSum %= 1000;         
        }
    }

    public String toString() {
        char[] letters = new char[3];
        int n = letterSum;
        for (int i = 0; i < 3; i++) {
            letters[2-i] = (char)('A' + (n%26));
            n /= 26;
        }
        return new String(letters) + String.format("%03d", numericSum);
    }

    private int value(String s, int index) {
        return Character.toUpperCase(s.charAt(index)) - 'A';
    }

/**
     * Example
     */
    public static void main(String[] args) {

        LicenseNumber lic = new LicenseNumber("ABC999");
        for (int i=0; i < 100; i++) {
            lic.increment(500);
            System.out.println(lic);
        }
    }

}

答案 1 :(得分:1)

String str = "abc123"
String newstr = "";
for(int i=0; i<str.length(); i++) {
    newstr += (char) (str.charAt(i) + 1);
}
// newstr now is "bcd234"

请注意,这并不像您想要的那样处理字符'z','Z'或'9'。但它应该给你一个开始。

另请注意,使用StringBuilder创建newstr会更有效。

答案 2 :(得分:0)

我想,

  char c='A';
  int no=97;
  System.out.println( (++c) + " " + (char)++no);

答案 3 :(得分:0)

您可以将String个字母和数字转换为char[]来完成此操作。完成后,您可以遍历数组,并逐个++

答案 4 :(得分:0)

你正在制作这样的字符串:“AAA000”,“AAA001”,......,“AAA999”,“AAB000”,......,“ZZZ999”,对吧?

可以把它想象成一个数字系统,其中不同的列不使用相同数量的数字。所以我们的数字是10-10-10-10,你的数字是26-26-26-10-10-10。使用你增加的基础整数,然后通过将模数连续除以10,10,10,26,26,26来转换为字母和数字。

要将牌照转换为其基础整数,请将字母位置(A == 0,B == 1等)乘以26的适当功率,并将数字乘以适当的幂10,然后添加他们都在一起。

答案 5 :(得分:0)

生成板数的一种简单方法是使一个整数变量递增,三个整数变量对应于字母,如下所示,请在适当的地方修改。一个技巧是使用String.format,它在一个整数和它的char对应物之间无缝转换(你也可以使用强制转换。)

class plateGenerator {
    int minLetter = "A".charAt(0);
    int maxLetter = "Z".charAt(0);
    int curLetter1 = minLetter;
    int curLetter2 = minLetter;
    int curLetter3 = minLetter;
    int number = 0;

    public String generatePlate() {
        String plate = String.format("%c%c%c-%03d",curLetter1,
                                curLetter2,curLetter3,number);
        increment();
        return plate;
    }
    private void increment() {
        number++;
        if (number == 1000) {
            number = 0;
            curLetter1++;
        }
        if (curLetter1 > maxLetter) {
            curLetter1 = minLetter;
            curLetter2++;
        }
        if (curLetter2 > maxLetter) {
            curLetter2 = minLetter;
            curLetter3++;
        }
        if (curLetter3 > maxLetter) {
            curLetter3 = minLetter;
            number++;
        }
    }

    public static void main(String[] args) {
        plateGenerator pg = new plateGenerator();
        for (int i = 0; i < 50000; i++) {
            System.out.println(pg.generatePlate());
        }
    }

}

答案 6 :(得分:0)

我还没有看到任何用于递增字母数字字符串的一般解决方案的代码示例,所以我会发布我的。

这将获取任何长度的字符串,其中包含字母数字字符的任何排序,将它们转换为大写字母并将其递增1(就像它是基数26一样)。如果数字换行,它也会引发异常。如果包装有意义,它真的取决于你......

private static string IncrementAlphaNumericString(string alphaNumericString)
{
    char[] an = alphaNumericString.ToCharArray();

    int i = an.Length - 1;
    while (true)
    {
        if (i <= 0)
            throw new Exception("Maxed out number!!!");

        an[i]++;

        if (an[i] - 1 == '9')
        {
            an[i] = 'A';
        }

        if (an[i] - 1 == 'Z')
        {
            an[i] = '0';
            i--;
            continue;
        }

        return new string(an);
    }
}