2016-07-09 4 views
0

Zuerst wird der Grund, warum ich tun müssen, ist dies, weil der API in Apache's Commons StringUtils Methode zwei Arrays mit gemeinsam genutzten Daten erstellen:Wie in Java

StringUtils.replaceEach(String text, String[] searchList, String[] replacementList) 

Was ich tun möchte, ist es, alle HTML-Sonderzeichenkodierungen ersetzen mit dem eigentlichen Sonderzeichen, was bedeutet, dass die searchList und replacementList Arrays werden ziemlich groß sein. Wie kann ich das leicht lesen und pflegen?

Ja, ich könnte zwei Arrays erstellen, aber wenn ich das tue, dann wird es sehr einfach sein, Fehler zu machen. Woher weiß ich, dass ich keine spezielle Kodierung vermisse, dass ich die richtige Position habe, etc. Ich hätte lieber Code, wo die Kodierung und das Zeichen nebeneinander liegen, um Fehler zu vermeiden. Ich schaute auf eine HashMap, aber dann können Sie nur die Schlüssel (Codierungen) bekommen und müssen durchlaufen, um die Zeichenwerte zu erhalten, die nicht sehr performant ist, vor allem nicht, wenn es viel laufen wird. Dasselbe gilt für ein zweidimensionales Array, in dem Sie jeden Lauf teilen müssen.

+1

Nicht wirklich eine Antwort, aber Sie sind sich bewusst von https://commons.apache.org/proper/commons-lang/javadocs/api-2.6/org/apache/commons/lang/StringEscapeUtils.html zu Escape/Unescape HTML? –

+0

Ich würde das gerne machen und sogar JSoup betrachten, das Problem ist, dass ich nur einige Codierungen ersetzen möchte und nicht alle. Ich bin nicht in der Lage, eine Möglichkeit zu finden, die Kodierungen selektiv zu ersetzen :( –

+0

Verstanden. In diesem Fall würde ich nur eine Liste machen, wo jedes Token aus dem Element besteht, nach dem und dem Ersatz zu suchen, und das drehen Listen Sie die beiden Arrays mit einer Art Funktion auf: Wenn Sie die searchList und die ersatzliste nur einmal aus der Token-Liste auffüllen, bin ich sicher, dass Sie ziemlich sicher sind .. –

Antwort

2

Welche Art von Leistung streben Sie an? Wenn Sie HTML-Sonderzeichen ersetzen möchten, können Sie das Ergebnis der Aufteilung einer HashMap-Codierung in Sonderzeichen in zwei statischen endgültigen Variablen nicht zwischenspeichern? Dies erfordert immer noch, dass Sie sich auf den Overhead der Verarbeitung einer HashMap festlegen, aber das Speichern des Ergebnisses verhindert, dass Sie die Prozedur bei jedem Aufruf ausführen. Etwas wie folgt aus:

import java.util.HashMap; 
import java.util.Map; 

class MyStringReplaceCLass { 
    private static final String[] encodings; 
    private static final String[] specialCharacters; 

    static { 
     HashMap<String, String> characterEncoding = new HashMap<String, String>(); 
     characterEncoding.put("...", "..."); 
     characterEncoding.put("...", "..."); 

     // Put other encodings here as necessary 

     encodings = new String[characterEncoding.size()]; 
     specialCharacters = new String[characterEncoding.size()]; 

     Map.Entry<String, String>[] entries = characterEncoding.entrySet(); 

     for (int i = 0; i < entries.length; i++) { 
      encodings[i] = entries[i].getKey(); 
      specialCharacters[i] = entries[i].getValue(); 
     } 
    } 

    public String replaceEachEncoding(String text) { 
     return StringUtils.replaceEach(String text, String[] searchList, String[] replacementList); 
    } 
} 

Von hier aus können Sie

MyStringReplaceClass.replaceEachEncoding(myText) 

nenne ich bin mir nicht ganz sicher, ob dies genau Ihren Anforderungen entspricht, aber ich fühle mich eine Karte von einer Art mit Licht Verarbeitung wäre die sauberste Lösung.

+0

Das ist ziemlich genau das, was ich gemacht habe, Sie haben nur die Kosten einmal mit dem statischen Block.Es ist schade, dass es keine eingebaute Struktur gibt, aber ja, das ist die einzige Art und Weise, wie ich die Informationen logisch gruppiert im Code sah. –

-1

Say für Textlänge von N, die Anzahl der Sonderzeichen M, search Länge von K. Mit HashMap, Zahlen vergleicht = N * K und die Anzahl der Austausch M.

Für Leistung, 1. Sie kann ein Tag für Ihre Such-/Ersatzliste erstellen. Dann scannen Sie Text und markieren Sie jeden Eintrag (notieren Sie die Indizes). N vergleicht. 2. Jetzt müssen Sie M Indizes durch K mögliche Zeichen ersetzen. Vergleiche = M K. Austausch M. Vergleicht N + M K < N * K. Austausch M

Hoffe es hilft!