2016-05-12 5 views
2

// Das Array von Werten ist in der Form { "var1", "val1", "var2", "val2", ..}Ersetzen eines Satzes Strings in einem String unabhängig voneinander (parallel)

public static String replaceMethod(String template, String... values) { 
      String p = template; 
      for (int i = 0; i < values.length; i += 2) { 
       p = p.replace(values[i], values[i+1]); 
      } 

      return populatedTemplate;  
     } 

Diese Methode ersetzt eine Reihe von Teilzeichenfolgen mit entsprechenden Werten in einer Zeichenfolge. Bsp: - string => abcd Sub-String-Array von Werten ["a", "b", "c", "d"] Es bedeutet ersetzen 'a' mit 'b' und 'b' mit 'c ".

So, jetzt kommt das Problem.

1.My obige Implementierung ersetzt 'a' mit 'b' in der ersten Schleife und dann in der zweiten Schleife, ersetzt es 'b' mit 'c', die endgültige Zeichenfolge als "cccd". Aber ich will das als "bccd" raus. Bei einem Ersatz in Serie wird der vorherige ersetzte String verwendet, um weiter zu arbeiten. Gibt es eine Möglichkeit, alle Sub-Strings auf eine effizientere Weise zu ersetzen.

2.Wie kann ich obige Methode mit Map anstelle von Array implementieren (zweites Argument der obigen Methode)? Ist Map besser oder ist die Implementierung in Ordnung?

+0

Für mich scheint es, wie das Problem der das erste Element aus einem Array entfernt .... ..http: //stackoverflow.com/questions/3663944/what-is-the-best-way-to-remove-the-first-element-from-an-array –

+0

Es ist ziemlich inkohärent, was Sie zu sagen versuchen .Wenn 'template =" abcd "' und 'values ​​= {" a "," b "," c "," d "}' dann lautet die Ausgabe "bbdd" – Hackerdarshi

+0

@Hackerdarshi wenn template - "abcd" und values ​​= { "a", "b", "c", "d"}, dann a -> b und c -> d, verwende ich alternative Indizes des Arrays für Schlüsselwertpaare. – tarun14110

Antwort

2

Sie verwenden besser eine Karte und durchlaufen jedes Zeichen in template. Auf diese Weise vermeiden Sie mehrfache Ersetzungen an derselben Indexposition.

String template = "abcd"; 
StringBuilder populatedTemplate = new StringBuilder(); 
HashMap<Character, Character> map = new HashMap<>(); 
map.put('a', 'b'); 
map.put('b', 'c'); 
for (int i = 0; i < template.length(); i++) { 
    populatedTemplate.append(
      map.getOrDefault(template.charAt(i), template.charAt(i))); 
} 
System.out.println(populatedTemplate); 

Einige Pro Argumente dieser Lösung im Vergleich zu OPs geschrieben Lösung.

  • Vermeiden mehr Substitutionen an der gleichen Indexposition, ersetzen in einem ersten Schritt a zu b und in einem zweiten Schritt b zu c die nur einmal über in einen unerwarteten wirksamen Ersatz von a zu c
  • Iterierte führen würden template
  • schaffen nicht für jedes Ersatzpaar ein neues String Objekt, wie es hier gewesen wäre p = p.replace(values[i], values[i+1]);
+0

danke, das ist es, was ich suche. Könnten Sie bitte ein paar mehr Profis dieser Implementierung geben? Eine, die ich mir vorstellen kann, ist, Iteration über die Vorlage Zeichenfolge nur einmal. Aber in meiner Implementierung, Vorlage String in iterated no_of_string mal. – tarun14110

+1

@ tarun14110 Ich habe etwas mehr Erklärung hinzugefügt. – SubOptimal

+0

hey, danke dafür. Können Sie dies bitte beantworten http://stackoverflow.com/questions/37217588/replace-multiple-sub-strings-in-a-string. Es ist mit diesem verwandt. – tarun14110

0

Im speziellen Fall von a nach b, b nach c und solchen Vergleichen können Sie das gewünschte Ergebnis erhalten, indem Sie das Array Werte in umgekehrter Reihenfolge angeben.

In einem allgemeineren Fall könnten Sie 'a' mit 'b', dann 'b' mit 'c' ersetzen ... Und so weiter, und alle Unterstreichen schließlich entfernen. Natürlich enthält Ihr Vorlagentext Unterstriche, Sie können ein anderes Zeichen auswählen, von dem Sie wissen, dass es nicht dort ist, und es stattdessen verwenden.

0

Gehen Sie mit der Lösung mit Map anstelle von String-Array, um ArrayIndexOutOfBoundsException zu vermeiden. zum Beispiel werden Sie Ausnahmen mit diesem Anruf mit String-Array erhalten:

replaceMethod("abcd", "a","b","c")

Karte verwenden:

 public static String replaceMethodMap(String template, Map<String, String> map) { 
    String p = template; 
    for (String key : map.keySet()) { 
     p = p.replace(key, map.get(key)); 
    } 

    return p;  
}