Frage

Ich habe eine Service-Methode, die einen String nimmt und dann ersetzt Tags im String mit Elementen aus einer Tag-Bibliothek. Wie folgt:

for( MetaDataDTO tag : tagValues )
{
    message = message.replace( tag.getKey(), tag.getText1() );
}

Offensichtlich; diese Menge neuer Saiten machen und ist schlecht. Aber der String ersetzt Verfahren umständlich ist innerhalb einer Zeichenfolge für mehrere Strings zu verwenden. Wie kann ich meine Methode effizienter zu machen?

Es ist für die Verwendung mit Textblöcken wie zum Beispiel:

Lieber # vorName #, Ihre Anwendung für # # Application hat # approvedRejected # sorry.

Dabei steht # vorName #, etc sind die Schlüssel in einem Metadaten-Datenbank. Es ist auch möglich, dass die Tags nicht durch Hash-Zeichen umgeben sein.

War es hilfreich?

Lösung 2

Vielen Dank für Ihre Hilfe Jungs. Sicherlich lernte mehr über Java. Hier ist meine Lösung. Es ist diese Art und Weise unterschiedlich aussehende Tags und Tags innerhalb von Tags zu unterstützen:

private static String replaceAllTags(String message, Map< String, String > tags)
{
    StringBuilder sb = new StringBuilder( message );
    boolean tagFound = false;
    /**
     * prevent endless circular text replacement loops
     */
    long recurrancyChecker = 5000;

    do
    {
        tagFound = false;
        Iterator it = tags.entrySet().iterator();
        while( it.hasNext() )
        {
            Map.Entry pairs = (Map.Entry) it.next();

            int start = sb.indexOf( pairs.getKey().toString() );

            while( start > -1 && --recurrancyChecker > 0 )
            {
                int length = pairs.getKey().toString().length();
                sb.replace( start, start + length, pairs.getValue().toString() );
                start = sb.indexOf( pairs.getKey().toString() );
                tagFound = true;
            }
        }
    }
    while( tagFound && --recurrancyChecker > 0 );
    return sb.toString();
}

Andere Tipps

Im Grunde wollen Sie die Ausführung von Matcher.replaceAll () wie folgt:

public static String replaceTags(String message, Map<String, String> tags) {
  Pattern p = Pattern.compile("#(\\w+)#");
  Matcher m = p.matcher(message);
  boolean result = m.find();
  if (result) {
    StringBuffer sb = new StringBuffer();
    do {
      m.appendReplacement(sb, tags.containsKey(m.group(1) ? tags.get(m.group(1)) : "");
      result = m.find();
    } while (result);
    m.appendTail(sb);
    message = sb.toString();
  }
  return message;
}

Hinweis: Ich habe eine Annahme über den gültigen Tag gemacht (nämlich \ w in der Regex). Sie müssen dies für gerecht, was wirklich gültig ist (zB "# ([\ w _] +) #").

Ich habe auch davon ausgegangen, die Tags oben sieht etwa so aus:

Map<String, String> tags = new HashMap<String, String>();
tags.add("firstName", "Skippy");

und nicht

tags.add("#firstName#", "Skippy");

Wenn die zweite korrekt werden Sie entsprechend anpassen müssen.

Dieses Verfahren macht genau einen Durchgang über das Meldungs-String, so dass es nicht viel effizienter als diese erhalten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top