5 Stimmen

Java Stringbuilder.replace

Betrachten Sie die folgenden Eingaben:

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

Was wäre der effizienteste Weg, während Sie einen StringBuilder verwenden, um eine beliebige Ziffer direkt vor einer Neun durch den nächsten Buchstaben nach ihr im Alphabet zu ersetzen?

Nach der Verarbeitung dieser Eingaben sollte die Ausgabe lauten:

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

Ich habe mir eine Weile den Kopf zerbrochen, und StringBuilder.setCharAt war die beste Methode, die mir einfiel.

Für jeden Rat oder Vorschlag wären wir dankbar.

2voto

Ernest Friedman-Hill Punkte 79357

Da man sich jedes Zeichen ansehen muss, ist die Leistung nie besser als linear mit der Größe des Puffers. Sie können also einfach etwas tun wie

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);

1voto

anubhava Punkte 713155

Sie können folgenden Code verwenden:

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));

OUTPUT:

[b9, ab9, b9b9, 99b99a, a9, aA9]

0voto

Dervall Punkte 5741

Sie möchten einen sehr einfachen Zustandsautomaten verwenden. Verfolgen Sie für jedes Zeichen, das Sie in der Eingabezeichenkette in einer Schleife durchlaufen, einen Booleschen Wert. Wenn das Zeichen eine 9 ist, setzen Sie den Booleschen Wert auf true. Handelt es sich bei dem Zeichen um einen Buchstaben, fügen Sie dem Buchstaben eine Eins hinzu und setzen Sie den Booleschen Wert auf false. Fügen Sie dann das Zeichen in die Ausgabe des Stringbuilders ein.

Für die Eingabe verwenden Sie eine Reader . Für die Ausgabe verwenden Sie eine StringBuilder .

0voto

DwB Punkte 35151

Verwenden Sie eine 1-Token-Look-Ahead-Parser-Technik. Hier ist einige psuedoish Code:

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);
    }
  }
}

0voto

Eine andere Lösung ist zum Beispiel die Verwendung von

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

in gewisser Weise, wie Ernest Friedman-Hill dargelegt hat, als experimentelles Beispiel, nicht das leistungsfähigste

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X