Java 从字符串计算下一个值

Java 从字符串计算下一个值,java,string,Java,String,在我的代码中,我试图让它计算随机字符串的下一个值,其中字符串遵循以下格式: AAA-AAAA-AAA-AAA 下一个值是AAA-AAAA-AAA-AAB,得到AAA-AAAA-AAA-AAF,然后再得到AAA-AAAA-AAA-AA1,依此类推,直到它达到9 从那以后,它应该继续前进,增加前面的字母,使之成为AAA-AAAA-AAA-ABA,并重新开始这个过程 我要如何用Java实现这一点?我在考虑递归,但我不知道从哪里开始。如果您需要遵循固定格式,可以使用基于15的计数器(值a-F1-9),也

在我的代码中,我试图让它计算随机字符串的下一个值,其中字符串遵循以下格式:

AAA-AAAA-AAA-AAA

下一个值是AAA-AAAA-AAA-AAB,得到AAA-AAAA-AAA-AAF,然后再得到AAA-AAAA-AAA-AA1,依此类推,直到它达到9

从那以后,它应该继续前进,增加前面的字母,使之成为AAA-AAAA-AAA-ABA,并重新开始这个过程


我要如何用Java实现这一点?我在考虑递归,但我不知道从哪里开始。

如果您需要遵循固定格式,可以使用基于15的计数器(值a-F1-9),也可以增加格式化值。您所需要的只是一个从末尾开始的简单循环。如果值小于Z,则递增并停止,如果有Z,则返回到a并后退一步。(携带)


顺便说一句,这听起来像是修改过的十六进制格式。这就是您想要的。

最简单的方法是将字符串转换为整数并返回。从你的帖子中,我猜你的数字顺序是
ABCDEF123456789
(0到14),所以我会用它。顺序
0123456789ABCDEF
更常见,在这种情况下,您可以使用库函数提供的十六进制

private static final char[] digitMap = new char[] {'A','B','C','D','E','1','2','3','4','5','6','7','8','9'};
private static final int base = digitMap.length;     
private static final Map<Character, Integer> reverseDigitMap = new HashMap<>();
static {
     // populate the reverse digit map
     for(int i=0;i<base;i++) {
          reverseDigitMap.put(digitMap[i], i);
     }
}

public static String toMyFormatString(long number) {
    StringBuilder res = new StringBuilder();
    // Add 13 digits to string in reverse order
    for(int i=0;i < 13;i++) {
         // Add dashes at correct locations
         if(i==3 || i == 6 || i == 10) { res.append('-') };
         // Output a character
         res.append(digitMap[number % base]);
         number = number / base;
    }
    // Change the order
    res.reverse();
    return res.toString();
}

/**
* @throws NullPointerException when an incorrect digit is encountered
**/
public static long fromMyFormatString(String numberString) {
    long result = 0;
    // Number is 16 characters of which 13 are digits
    for(int i = 0; i < 16; i++) {
          char digit = numberString.charAt(i);
          // Skip "-"
          if(digit == '-') { continue; };
          result = result * base; // We're adding the next digit
          result = result + reverseDigitMap.get(digit);
    }
    return result;
}
private static final char[]digitMap=new char[]{'A','B','C','D','E','1','2','3','4','5','6','7','8','9'};
私有静态final int base=digitMap.length;
私有静态最终映射reverseDigitMap=newHashMap();
静止的{
//填充反向数字映射

对于(int i=0;i我的想法是枚举类型会使这更容易。添加一个像这样的nextValue方法。在加法逻辑中使用它。只需调用.nextValue(),你就会得到下一个“数字”应该是什么,如果.nextValue最终变成“a”,那么你就可以实现携带该值的逻辑。一种表示每个整体的简单方法“数字”可能是一个列表。但是下面的这个应该会让事情变得简单一点,因为从9到a的转换是内置的

enum myEnum { 
       //had to use A1-A9 to represent the numbers because numbers themselves are not allowed
    A, B, C, D, E, F, A1, A2, A3, A4, A5, A6, A7, A8, A9;

    public myEnum nextValue() {
        return this.ordinal() < myEnum.values().length - 1
                ? myEnum.values()[this.ordinal() + 1]
                : A; //returns A if the value of this.ordinal = A9
    }

};
enum myEnum{
//必须使用A1-A9来表示数字,因为数字本身是不允许的
A、 B、C、D、E、F、A1、A2、A3、A4、A5、A6、A7、A8、A9;
public myEnum nextValue(){
返回此.ordinal()

您可以向枚举添加不同的方法,如.toString()、.valueOf()等等等,以您喜欢的任何格式返回每个数字的值。

如果您只是想增加一个,您应该能够通过按顺序定义一个字符串,然后从后到前循环随机字符串,跳过所有不在定义的数字中的值并增加。这应该适用于任何arbitr一组数字的二进制定义

public String incrementString(String randomString) {
    // The ordering of digits.
    String digits = "ABCDEF123456789";

    // A StringBuffer to do a transform
    StringBuffer inPlace = new StringBuffer(randomString);

    // Loop through all of the digits of your random string...
    for (int i = 0 ; i < inPlace.length() ; i++) {
        // The index we are checking since we are traversing
        // back to front.
        int stringIndex = inPlace.length() - (i + 1);

        // This is the index of the digit at 'stringIndex' 
        // in our 'digits' String
        int digitIndex = digits.indexOf(stringIndex);

        // If it's not there (meaning we have found a '-' character)
        // just continue.
        if (digitIndex == -1) {
            continue; 
        // If it is not the last character in our 'digits' String, we can 
        // just replace and return.
        } else if (digitIndex < digits.length() - 1) {
            inPlace.setCharAt(stringIndex, digits.charAt(digitIndex + 1));
            return inPlace.toString();

        // If it IS the last character in our 'digits' String, we need to
        // replace it with the first character in our 'digits' String and
        // keep going.
        } else {
            inPlace.setCharAt(stringIndex, digits.charAt(0));
        }
    }

    // In the event that every character in our random string was the
    // last digit in our 'digits' String, (In this case, 999-9999-999-999) 
    // we will exit the loop without returning, so do it here.
    return inPlace.toString();
}
公共字符串递增字符串(字符串随机字符串){
//数字的顺序。
字符串数字=“ABCDEF123456789”;
//用于执行转换的StringBuffer
StringBuffer inPlace=新的StringBuffer(随机字符串);
//循环遍历随机字符串的所有数字。。。
对于(int i=0;i
对不起,但是你只是想重复所有16^13的可能性吗?它不是十六进制,
A
to
F
是10到15的十六进制,而在这种情况下,它们是0到5,
1
to
9
是10到14的是的,我只是注意到也没有0,所以它是某种形式的基数15,而不是16。这将是一种形式ke 15^13可能性…在我看来是基数16,而不是基数26