You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by ba...@apache.org on 2009/06/30 07:47:40 UTC

svn commit: r789567 - /commons/proper/lang/trunk/src/java/org/apache/commons/lang/text/translate/LookupTranslator.java

Author: bayard
Date: Tue Jun 30 05:47:39 2009
New Revision: 789567

URL: http://svn.apache.org/viewvc?rev=789567&view=rev
Log:
Performance improvement. Switching from looping through a doubled array to using a Map. This probably costs more for simple cases like Java/EcmaScript/Xml, but makes up for it in the Html case. This gets performance of the testUnescapeHexCharsHtml method back down to near the same region as the original code

Modified:
    commons/proper/lang/trunk/src/java/org/apache/commons/lang/text/translate/LookupTranslator.java

Modified: commons/proper/lang/trunk/src/java/org/apache/commons/lang/text/translate/LookupTranslator.java
URL: http://svn.apache.org/viewvc/commons/proper/lang/trunk/src/java/org/apache/commons/lang/text/translate/LookupTranslator.java?rev=789567&r1=789566&r2=789567&view=diff
==============================================================================
--- commons/proper/lang/trunk/src/java/org/apache/commons/lang/text/translate/LookupTranslator.java (original)
+++ commons/proper/lang/trunk/src/java/org/apache/commons/lang/text/translate/LookupTranslator.java Tue Jun 30 05:47:39 2009
@@ -18,14 +18,18 @@
 
 import java.io.IOException;
 import java.io.Writer;
+import java.util.HashMap;
 
 /**
  * Translates a value using a lookup table. 
  * @since 3.0
  */
+// TODO: Replace with a RegexLookup? Performance test.
 public class LookupTranslator extends CharSequenceTranslator {
 
-    protected CharSequence[][] lookup;
+    private HashMap<CharSequence, CharSequence> lookupMap;
+    private int shortest = Integer.MAX_VALUE;
+    private int longest = 0;
 
     /**
      * Define the lookup table to be used in translation
@@ -33,18 +37,34 @@
      * @param CharSequence[][] Lookup table of size [*][2]
      */
     public LookupTranslator(CharSequence[][] lookup) {
-        this.lookup = lookup;
+        lookupMap = new HashMap<CharSequence, CharSequence>();
+        for(CharSequence[] seq : lookup) {
+            this.lookupMap.put(seq[0], seq[1]);
+            int sz = seq[0].length();
+            if(sz < shortest) {
+                shortest = sz;
+            }
+            if(sz > longest) {
+                longest = sz;
+            }
+        }
     }
 
     /**
      * {@inheritDoc}
      */
     public int translate(CharSequence input, int index, Writer out) throws IOException {
-        CharSequence subsequence = input.subSequence(index, input.length());
-        for(CharSequence[] seq : lookup) {
-            if( subsequence.toString().startsWith(seq[0].toString()) ) {
-                out.write(seq[1].toString());
-                return seq[0].length();
+        int max = longest;
+        if(index + longest > input.length()) {
+            max = input.length() - index;
+        }
+        // descend so as to get a greedy algorithm
+        for(int i=max; i >= shortest; i--) {
+            CharSequence subSeq = input.subSequence(index, index + i);
+            CharSequence result = lookupMap.get(subSeq);
+            if(result != null) {
+                out.write(result.toString());
+                return i;
             }
         }
         return 0;