当前位置: 首页 > 知识库问答 >
问题:

递增字母数字值,但限制为3个字符

经福
2023-03-14

场景是——我读取文件的最后一行,将其递增一行,然后写回。

读写操作已完成。我发现很难增加alpha数值,因为它有一些条件。

条件包括:

  • 它应该只有3个字符长
  • 示例:A01、A02。。。。A99、B01、B02。。。。B99
  • 一旦达到Z99,应为AA1、AA2、AA3。。。AA9
  • 然后AB1,AB2,。。。AZ9
  • 因此,基本上,当递增值时,不应变为AA10,即4个字符

我现在所做的是分离字母和整数,递增并将它们连接回来。

到目前为止的代码:

String[] part = lastLine.split("(?<=\\D)(?=\\d)");
    System.out.println(part[0]);
    System.out.println(part[1]);    

int numberOnly = Integer.parseInt(lastLine.replaceAll("[^0-9]", ""));
numberOnly++;

String lettersOnly = lastLine.replaceAll("[^A-Z]", "");

if (lettersOnly.length() > 1){

            String lastLetter = lettersOnly.substring(lettersOnly.length() - 1);

            if(lastLetter.equalsIgnoreCase("Z") && number.equalsIgnoreCase("9") ){

                String notLastLetter = lettersOnly.substring(lettersOnly.length() - 2);
                char d = lettersOnly.charAt(0);
                d++;
                System.out.println("Letters after increment more tan two : " +d);
                lettersOnly = Character.toString(d) + "Z";
            }

        }
            else{

            }



        System.out.println("Letters after increment : " +lettersOnly);

任何帮助都将不胜感激。

共有3个答案

荀辰钊
2023-03-14

一个简单的解决方案是在Base36中计数

试试这个:

class AlphaNumericIncrementer {
    public static void main(String[] args) {
        /*
        When starting at '000' => We hit 'zzz' (i.e. Dead End) at 46,656
        When starting at 'A00' => We hit 'zzz' (i.e. Dead End) at 33,696
        */

        int index = 0;
        String currentNumber = "000";
        while (index < 46656) {
            index++;

            String incrementedNumber = base36Incrementer(currentNumber, 36);
            currentNumber = incrementedNumber;

            if (incrementedNumber.toCharArray().length != 3) {
                System.out.println("We got intruder with length: " + incrementedNumber.toCharArray().length);
                System.out.println("Our Intruder is: " + incrementedNumber);
                break;
            }

            System.out.println(incrementedNumber);
        }
        System.out.println("Number of entries: " + index);
    }

    // The function that increments current string
    public static String base36Incrementer(String v, int targetBase) {
        String answer = Integer.toString(Integer.parseInt(v, targetBase) + 1, targetBase);

        return String.format("%3s", answer).replace(' ', '0');
    }
}
司空浩邈
2023-03-14

将每个“数字”从右向左分别递增,然后处理到下一个数字:

String number;//number - is your originally string
char[] digits = number.toCharArray();
boolean overflow = true;
for(int i = 2; i >= 0; i--){
    if(overflow){
        switch(digits[i]){
            case 'Z':
                digits[i] = '0';
                overflow = true;
                break;
            case '9':
                digits[i] = 'A';
                overflow = false;
                break;
            default:
                digits[i]++;
                overflow = false;
        }
    }
}
if(overflow){
    //handle ZZZ overflow here
}
String result = new String(digits);
洪鹏海
2023-03-14
public class AlphaNumericCounter {
    String[] part;

    int counter; //Variable storing numeric part of counter

    String alpha; //Variable storing Alpha part of counter

    static String final_output = "A00"; // First Input considered as A00 and also the variable which will be store each count

    static boolean continueIncrement = true; //For running the loop till we reach ZZ9

    /* Def constructor */    
    public AlphaNumericCounter() {
    }

    /* Constructor called from main method with primary input A00 */
    public AlphaNumericCounter(String number) {
        part = number.split("(?<=\\D)(?=\\d)");
    }

    /* Function called each time from inside loop to generate next alphanumeric count */
    public void increment() {
        part = final_output.split("(?<=\\D)(?=\\d)");
        counter = Integer.valueOf(part[1]) + 1;
        alpha = part[0];
    }

    public String toString() {
        if (alpha.length() == 1){
            if (String.valueOf(counter).length() > 2){
                if ((int)alpha.charAt(0) + 1 > 90/*If Z encountered*/){
                    alpha = "AA";
                }else{
                    alpha = String.valueOf((char)((int)alpha.charAt(0) + 1));//Take Next Alphabet
                }
                counter = 1; //Reset counter to 1
            }
        }else{
            //We have AA, AB ... ZZ format of alpha
            if (String.valueOf(counter).length() > 1){
                if ((int)alpha.charAt(0) + 1 > 90 && (int)alpha.charAt(1) + 1 > 90){
                    continueIncrement = false;
                    System.out.println("NO MORE COMBINATION AVAILABLE"); //We reached ZZ
                    return "";
                }else if ((int)alpha.charAt(1) + 1 <= 90){
                    alpha = String.valueOf((char)((int)alpha.charAt(0))) + String.valueOf((char)((int)alpha.charAt(1) + 1));
                    counter = 1;
                }else if ((int)alpha.charAt(1) + 1 > 90){
                    if ((int)alpha.charAt(0) + 1 <= 90){
                        alpha = String.valueOf((char)((int)alpha.charAt(0) + 1)) + "A";
                        counter = 1;
                    }
                }
            }
        }

        generateString();

        return final_output;

    }

    private void generateString(){
        int l1 = String.valueOf(counter).length();
        int l2 = alpha.length();

        final_output = alpha + (l2 == 1 && l1 == 1 ? "0" : "") + String.valueOf(counter);
    }

    public static void main(String[] args) {
        AlphaNumericCounter lic = new AlphaNumericCounter(final_output);

        while (continueIncrement){
            lic.increment();
            System.out.println(lic);
        }
    }
}
 类似资料:
  • 我需要一个java方法,它接受一个整数,然后将其递增并为您提供相应的alpha字符。类似于这样: 因此,如果我传递value等于,那么它应该递增并返回字母。如果我传递它,那么它应该返回字母。如果我将数字传递给它,那么它应该返回。如果我将数字传递给它,那么它应该返回等等。 alpha几乎模拟了excel工作表列的表示方式,我需要做的就是通过传递一个数字从方法中获取alpha值。除了从返回的字符串之外

  • 问题内容: 基本上,我的情况要求我检查在一种情况下由用户从键盘输入定义的字符串是否仅为字母字符,而在另一种情况下仅为数字。这是用Java编写的。 我当前的代码: 我需要确保StudentID仅是数字,并且每个名称段都是字母。 问题答案: 已经可以使用方法检查下一个标记是否具有给定的模式/类型。 这是一个使用正则表达式用于验证下一个标记仅由字母组成的示例: 这是一个示例会话: 要验证下一个令牌是可以

  • 问题内容: 改善这个问题 我是android编码练习的新手 假设这是我的第一个ID,我希望使用共享的首选项将此值自动递增1并用作员工ID。如ABB20180002,ABB20180003,ABB20180004等。 问题答案: 您不能直接增加字母数字值。如果要这样做,您需要为其编写一些代码行 这是 activity_main.xml 这是 MainActivity.java 希望这会帮助你。

  • 问题内容: 这可能在MySql中吗?我可以有一个以字母为前缀的自动递增主键,例如R1234,R1235,R1236 …等等吗? 问题答案: 您可以做的是将密钥存储为两列。一个char前缀和一个auto-incrementing int,它们都被分组为主键。

  • 问题内容: 我试图弄清楚如何将数组中的一组字母值向下移动一个步骤。例如,我的数组包含值(“ d”,“ e”,“ f”,“ g”,“ h”),而我想将其更改为(“ c”,“ d”,“ e”,“ f” “, “G”)。这是我正在使用的代码: 当我使用正值时,字母会改变;但是,负数似乎根本不起作用。 问题答案: PHP已超载了字符串;并非如此。你可以做同样的事情更清洁的代码,以及: 这是一个演示。请注意

  • 问题内容: 是否可以在MySQL中制作结合了alpha元素和数字的自动增量功能? 我有一个具有QAb99,QAb101,QAd9003等键的现有系统。最大数字部分的范围为1到9999,而字母以QA开头,范围从QAa到QAd等,最终将通过QAd9999到QAe1等。 。 在SQL或SQL外部(例如php脚本)管理生成新密钥是否更好? 谢谢。 问题答案: 我前一阵子问过。不幸的是,Mysql并没有这样