Java实现MongoDB编号字符串末尾数字连续递增问题求解
字符串ID递增问题修复
问题说明
现有固定格式ID字符串ABC2022050400000000,需要实现末尾数字序列的连续递增功能,要求支持进位逻辑,可正常生成从ABC2022050400000001、ABC2022050400000002到ABC2022050400002110的连续编号。
原有实现仅能输出原字符串和最后一位单次加1的结果,无法处理连续进位场景,原代码如下:
for(int i=0;i<paddedID.length();i++) { String newTitleSearch; int len = paddedID.length(); String allButLast = paddedID.substring(0, len - 1); System.out.println(allButLast); int val=1; newTitleSearch = allButLast + new Character((char) (paddedID.charAt(len - 1) +val++)); System.out.println(newTitleSearch); }
原代码逻辑问题
- 每次循环仅截取字符串除最后一位的片段,仅对最后一位字符的ASCII值做加1操作,没有任何进位处理逻辑:当最后一位是字符
9时,加1后得到的是ASCII码对应的冒号:,不会触发前一位的数值递增 - 循环内部每次都将增量值
val初始化为1,不存在增量累计逻辑,每次循环都仅给最后一位加固定值1 - 没有拆分固定前缀和可变数字段,遍历整个字符串长度的逻辑完全冗余,前缀
ABC20220504为固定值不需要参与递增计算
修正实现
实现思路
首先拆分ID的固定前缀和末尾可变数字段,将数字段转为数值类型做递增计算,天然支持进位逻辑,递增完成后按原数字段长度补前导零,再和前缀拼接即可。如果数字段长度超过Long类型上限,可以改用字符数组从后往前遍历手动处理进位。
可运行代码(常规长度数字段)
public class IdGenerator { public static void main(String[] args) { String originalId = "ABC2022050400000000"; // 固定前缀长度:前11位为"ABC20220504",剩余8位为递增数字段 final int PREFIX_LENGTH = 11; String prefix = originalId.substring(0, PREFIX_LENGTH); String numberPart = originalId.substring(PREFIX_LENGTH); final int NUMBER_PART_LENGTH = numberPart.length(); long baseNumber = Long.parseLong(numberPart); // 示例:生成从+1到+2110的连续ID for (int step = 1; step <= 2110; step++) { long currentNum = baseNumber + step; // 补前导零,保持数字段长度固定 String currentNumStr = String.format("%0" + NUMBER_PART_LENGTH + "d", currentNum); String currentId = prefix + currentNumStr; System.out.println(currentId); } } }
超长数字段兼容实现(手动处理进位)
如果数字段长度超过18位(超出Long类型数值范围),可以用字符数组手动处理进位,不受数值类型长度限制:
public static String getNextId(String currentId, int prefixLength) { char[] idChars = currentId.toCharArray(); int carry = 1; // 固定递增量为1 // 从数字段最后一位向前遍历,处理进位 for (int i = idChars.length - 1; i >= prefixLength && carry == 1; i--) { int digit = idChars[i] - '0'; digit += carry; if (digit == 10) { digit = 0; carry = 1; } else { carry = 0; } idChars[i] = (char) (digit + '0'); } // 如果需要处理数字段全为9、进位溢出到前缀的场景,可在此处扩展逻辑 return new String(idChars); }
内容的提问来源于stack exchange,提问作者Rose
相关产品推荐
相关产品推荐

