Вот 3 решения: первые два несколько арифметических incrementations в то время как третий больше персонаж манипуляциями.
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();
}
Третий:
Это работает с вашими текущими «требованиями». По сравнению с тем, что задается в начале, это не просто «левая часть, состоящая из буквы» + «правая часть, состоящая из цифр». Теперь это «все идет», а буквы перекатываются от А до Я в А, а цифры от 0 до 9 до 0. Когда буква достигает Z, она сбрасывается до А, затем цифра/буква слева от нее увеличивается.
Если все номера увеличиваются, то он не добавляет новую цифру слева. Вы не говоря уже о том, что в вашем вопросе, но я уверен, что вы можете понять это отсюда:
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 не важно? Я чувствую, что это скорее на вас, чтобы понять, каковы ваши требования (например, домашнее задание ..)
Технически это отвечает на вопрос, поскольку он был спрошен первоначально (со многими изменениями на этом пути).
Я думаю, вы имеете в виду значение после 'AAA999'' AAB000', а не 'AAZ000'. Кроме того, это не база 36, а 3 места базы 26 и 3 места базы 10. Не совсем ясно, что вы пытаетесь сделать. Вы должны показать нам код, который вы написали, и объяснить, что вы не понимаете. –
Вы посмотрели на это? http://stackoverflow.com/questions/15735079/convert-from-one-base-to-another-in-java –
isnt значение после AAA999 -> AAA99A в базе 36? – alexbt