Если вы хотите что-то вроде aaab
=> aaac
, а не => bbbc
, это будет работать:
public String incremented(String original) {
StringBuilder buf = new StringBuilder(original);
int index = buf.length() -1;
while(index >= 0) {
char c = buf.charAt(i);
c++;
buf.setCharAt(i, c);
if(c == 0) { // overflow, carry one
i--;
continue;
}
return buf.toString();
}
// overflow at the first "digit", need to add one more digit
buf.insert(0, '\1');
return buf.toString();
}
Это обрабатывает все символы (на самом деле char
значения)то же самое, и терпит неудачу (делает странные вещи) для некоторых кодовых точек Юникода вне первой плоскости (которые занимают два значения символов в строке).
Если вы хотите использовать только английские строчные буквы в качестве цифр вы можете попробовать этот вариант:
public final static char MIN_DIGIT = 'a';
public final static char MAX_DIGIT = 'z';
public String incrementedAlpha(String original) {
StringBuilder buf = new StringBuilder(original);
int index = buf.length() -1;
while(index >= 0) {
char c = buf.charAt(i);
c++;
if(c > MAX_DIGIT) { // overflow, carry one
buf.setCharAt(i, MIN_DIGIT);
i--;
continue;
}
buf.setCharAt(i, c);
return buf.toString();
}
// overflow at the first "digit", need to add one more digit
buf.insert(0, MIN_DIGIT);
return buf.toString();
}
Это делает a
=> b
=> c
, y
=> z
=> aa
=>ab
.
, если вы хотите выполнить дополнительные вычисления со строкой, рассмотрите возможность использования StringBuilder (или StringBuffer для многопоточного доступа), а не повторяйте копирование между String и StringBuilder.Или используйте для этого класс, такой как BigInteger.