Author: britter
Date: Sun Mar 22 09:52:25 2015
New Revision: 1668348

URL: http://svn.apache.org/r1668348
Log:
LANG-935: Possible performance improvement on string escape functions. Thanks 
to Fabian Lange and Thomas Neidhart.

Modified:
    commons/proper/lang/trunk/src/changes/changes.xml
    
commons/proper/lang/trunk/src/main/java/org/apache/commons/lang3/text/translate/LookupTranslator.java

Modified: commons/proper/lang/trunk/src/changes/changes.xml
URL: 
http://svn.apache.org/viewvc/commons/proper/lang/trunk/src/changes/changes.xml?rev=1668348&r1=1668347&r2=1668348&view=diff
==============================================================================
--- commons/proper/lang/trunk/src/changes/changes.xml [utf-8] (original)
+++ commons/proper/lang/trunk/src/changes/changes.xml [utf-8] Sun Mar 22 
09:52:25 2015
@@ -22,6 +22,7 @@
   <body>
 
   <release version="3.4" date="tba" description="tba">
+    <action issue="LANG-935" type="update" dev="britter" due-to="Fabian Lange, 
Thomas Neidhart">Possible performance improvement on string escape 
functions</action>
     <action issue="LANG-948" type="fix" dev="britter" due-to="Andrey 
Khobnya">Exception while using ExtendedMessageFormat and escaping 
braces</action>
     <action issue="LANG-1098" type="update" dev="britter" due-to="Mikhail 
Mazurskiy, Fabian Lange">Avoid String allocation in 
StrBuilder.append(CharSequence)</action>
     <action issue="LANG-1098" type="update" dev="britter" due-to="MichaƂ 
Kordas">Update maven-checkstyle-plugin to 2.14</action>

Modified: 
commons/proper/lang/trunk/src/main/java/org/apache/commons/lang3/text/translate/LookupTranslator.java
URL: 
http://svn.apache.org/viewvc/commons/proper/lang/trunk/src/main/java/org/apache/commons/lang3/text/translate/LookupTranslator.java?rev=1668348&r1=1668347&r2=1668348&view=diff
==============================================================================
--- 
commons/proper/lang/trunk/src/main/java/org/apache/commons/lang3/text/translate/LookupTranslator.java
 (original)
+++ 
commons/proper/lang/trunk/src/main/java/org/apache/commons/lang3/text/translate/LookupTranslator.java
 Sun Mar 22 09:52:25 2015
@@ -19,6 +19,7 @@ package org.apache.commons.lang3.text.tr
 import java.io.IOException;
 import java.io.Writer;
 import java.util.HashMap;
+import java.util.HashSet;
 
 /**
  * Translates a value using a lookup table.
@@ -29,6 +30,7 @@ import java.util.HashMap;
 public class LookupTranslator extends CharSequenceTranslator {
 
     private final HashMap<String, CharSequence> lookupMap;
+    private final HashSet<Character> prefixSet;
     private final int shortest;
     private final int longest;
 
@@ -44,11 +46,13 @@ public class LookupTranslator extends Ch
      */
     public LookupTranslator(final CharSequence[]... lookup) {
         lookupMap = new HashMap<String, CharSequence>();
+        prefixSet = new HashSet<Character>();
         int _shortest = Integer.MAX_VALUE;
         int _longest = 0;
         if (lookup != null) {
             for (final CharSequence[] seq : lookup) {
                 this.lookupMap.put(seq[0].toString(), seq[1]);
+                this.prefixSet.add(seq[0].charAt(0));
                 final int sz = seq[0].length();
                 if (sz < _shortest) {
                     _shortest = sz;
@@ -71,10 +75,17 @@ public class LookupTranslator extends Ch
         if (index + longest > input.length()) {
             max = input.length() - index;
         }
+
+        if (!prefixSet.contains(input.charAt(index))) {
+            // no translation exists for the input at position index
+            return 0;
+        }
+
         // descend so as to get a greedy algorithm
         for (int i = max; i >= shortest; i--) {
             final CharSequence subSeq = input.subSequence(index, index + i);
             final CharSequence result = lookupMap.get(subSeq.toString());
+
             if (result != null) {
                 out.write(result.toString());
                 return i;


Reply via email to