JAVA中的字母数字增量算法

我需要实现字母数字增量算法,例如AAA001应该变成AAA002 AAA999应该变成AAB000,依此类推。

所有字母均为大写字母,字母为0-9。它可以在字母数字字符串的任何位置包含字母或字母。

但是有一些规则,例如不应将000或666串联在一起。可以稍后完成,但是我需要基本的逻辑来实现算法。

我看到很多人不明白我的问题。试想一下,车辆的车牌号不过是一个字母数字系列,该字母数字系列可以包含一些排除的字符,例如BB6660->

666,两者之间不允许有三重6。

它应该支持不同的格式,例如-

    @@@##

@#@@##

1@#@@##

@@@@####

##@@#@

@ means alphabet A-Z

# means numbers 0-9

例子:

    AFG99 + 1= AFH00

A2GF23 + 1 = A2GF24

1A9AU99 + 1 = 1A9AV00

AAZZ9999 + 1 = ABAA0000

11AA9Z + 1 = 11AB0A

我需要某种数学解决方案,以便可以进行数学运算并轻松地对其进行递增,而无需使用字符增量。

我还需要两个范围之间的计数,例如AAA003和AA010之间有多少计数?

    AAA010 - AAA003 = 7

我会很感激的..

回答:

这里有3个解决方案:前两个是算术增量,而第三个更多是字符操作。

这三个实现都通过相同的单元测试:

 assertEquals("1DDA01A", MyClass.increment("1DDA00Z"));

assertEquals("1A9AV00", MyClass.increment("1A9AU99"));

assertEquals("AFH00", MyClass.increment("AFG99"));

assertEquals("A2GF24", MyClass.increment("A2GF23"));

assertEquals("ABAA0000", MyClass.increment("AAZZ9999"));

assertEquals("11AB0A", MyClass.increment("11AA9Z"));

public static String increment(String number) {

Pattern compile = Pattern.compile("^(.*?)([9Z]*)$");

Matcher matcher = compile.matcher(number);

String left="";

String right="";

if(matcher.matches()){

left = matcher.group(1);

right = matcher.group(2);

}

number = !left.isEmpty() ? Long.toString(Long.parseLong(left, 36) + 1,36):"";

number += right.replace("Z", "A").replace("9", "0");

return number.toUpperCase();

}

public static String increment(String number) {

Pattern compile = Pattern.compile("^(.*?)([0-9]*|[A-Z]*)$");

Matcher matcher = compile.matcher(number);

String remaining = number;

String currentGroup = "";

String result = "";

boolean continueToNext = true;

while (matcher.matches() && continueToNext) {

remaining = matcher.group(1);

currentGroup = matcher.group(2);

int currentGroupLength = currentGroup.length();

int base = currentGroup.matches("[0-9]*") ? 10 : 36;

currentGroup = Long.toString(Long.parseLong("1" + currentGroup, base) + 1, base); // The "1" if just to ensure that "000" doesn't become 0 (and thus losing the original string length)

currentGroup = currentGroup.substring(currentGroup.length() - currentGroupLength, currentGroup.length());

continueToNext = Long.valueOf(currentGroup, base) == 0;

if (base == 36) {

currentGroup = currentGroup.replace("0", "A");

}

result = currentGroup + result;

matcher = compile.matcher(remaining);

}

result = remaining + result;

return result.toUpperCase();

}

这适用于您当前的“要求”。与开始时所问的问题相比,这不仅仅是“由字母组成的左半部分”

+“由数字组成的右半部分”。现在,“一切都变了”,字母从A滚动到Z到A,数字从0滚动到9到0。当字母到达Z时,它将重置为A,然后左侧的数字/字母递增。

如果所有数字均递增,则不会在左侧添加新数字。您没有在问题中提到这一点,但是我敢肯定您可以从这里弄清楚这一点:

public static String increment(String number) {

char[] cars = number.toUpperCase().toCharArray();

for (int i = cars.length - 1; i >= 0; i--) {

if (cars[i] == 'Z') {

cars[i] = 'A';

} else if (cars[i] == '9') {

cars[i] = '0';

} else {

cars[i]++;

break;

}

}

return String.valueOf(cars);

}

至于“计数”,您的示例不足以理解逻辑。它仅计算数字吗?字母呢?它遵循baseXx吗?

AA010-AAA003 = 7,3 A与2 A无关吗?我觉得这是您要了解您的要求(即:家庭作业..)

从技术上讲,这可以回答最初提出的问题(在此过程中进行了许多修改)。

以上是 JAVA中的字母数字增量算法 的全部内容, 来源链接: utcz.com/qa/408951.html

回到顶部