Java Stringbuilder.replace - PullRequest
       4

Java Stringbuilder.replace

5 голосов
/ 06 февраля 2012

Рассмотрим следующие входные данные:

String[] input = {"a9", "aa9", "a9a9", "99a99a"};

Что было бы наиболее эффективным способом при использовании StringBuilder для замены любой цифры непосредственно перед цифрой 9 следующей буквой после нее в алфавите?

После обработки этих входных данных результат должен быть:

String[] output = {"b9", "ab9", "b9b9", "99b99a"}

Я некоторое время чесал голову, и StringBuilder.setCharAt был лучшим методом, который я мог придумать.

Буду признателен за любые советы или предложения.

Ответы [ 5 ]

2 голосов
/ 07 февраля 2012

Поскольку вы должны смотреть на каждый символ, вы никогда не будете работать лучше, чем линейный размер буфера.Так что вы можете просто сделать что-то вроде

for (int i=1; buffer.length() ++i) // Note this starts at "1"
    if (buffer.charAt[i] == '9')
        buffer.setCharAt(i-1, buffer.getCharAt(i-1) + 1);
1 голос
/ 07 февраля 2012

Вы можете использовать следующий код:

String[] input = {"a9", "aa9", "a9a9", "99a99a", "z9", "aZ9"};
String[] output = new String[input.length];
Pattern pt = Pattern.compile("([a-z])(?=9)", Pattern.CASE_INSENSITIVE);
for (int i=0; i<input.length; i++) {
    Matcher mt = pt.matcher(input[i]);
    StringBuffer sb = new StringBuffer();
    while (mt.find()) {
        char ch = mt.group(1).charAt(0);
        if (ch == 'z') ch = 'a';
        else if (ch == 'Z') ch = 'A';
        else ch++;
        mt.appendReplacement(sb, String.valueOf(ch));
    }
    mt.appendTail(sb);
    output[i] = sb.toString();
}
System.out.println(Arrays.toString(output));

ВЫХОД:

[b9, ab9, b9b9, 99b99a, a9, aA9]
0 голосов
/ 07 февраля 2012

другое решение, например, это использовать

StringUtils.indexOf(String str, char searchChar, int startPos) 

таким образом, как указал Эрнест Фридман-Хилл, возьмите это в качестве экспериментального примера, а не самого производительного

0 голосов
/ 07 февраля 2012

Использовать технику синтаксического анализа на 1 жетон.Вот некоторый псевдоиш код:

for (int index = 0; index < buffer.length(); ++index)
{
  if (index < buffer.length() - 1)
  {
    if (buffer.charAt(index + 1) == '9')
    {
      char current = buffer.charAt(index) + 1; // this is probably not the best technique for this.
      buffer.setCharAt(index, current);
    }
  }
}
0 голосов
/ 07 февраля 2012

Вы хотите использовать очень простой конечный автомат.Для каждого символа, который вы просматриваете во входной строке, следите за логическим значением.Если символ 9, установите логическое значение true.Если символ представляет собой букву, добавьте ее к букве и установите для логического значения значение false.Затем добавьте символ к строку вывода.

Для ввода вы используете Reader.Для вывода используйте StringBuilder.

...