Added stringCode().

git-svn-id: https://samskivert.googlecode.com/svn/trunk@1710 6335cc39-0255-0410-8fd6-9bcaacd3b74c
This commit is contained in:
mdb
2005-09-08 01:17:34 +00:00
parent 2e35d2d8f1
commit 7394f64138
@@ -41,6 +41,7 @@ import java.security.NoSuchAlgorithmException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Iterator;
import java.util.StringTokenizer;
import java.util.regex.Matcher;
@@ -1345,7 +1346,52 @@ public class StringUtil
return nname.toString();
}
private final static String XLATE = "0123456789abcdef";
/**
* See {@link #stringCode(String,StringBuffer)}.
*/
public static int stringCode (String value)
{
return stringCode(value, null);
}
/**
* Encodes (case-insensitively) a short English language string into a
* semi-unique integer. This is done by selecting the first eight
* characters in the string that fall into the set of the 16 most
* frequently used characters in the English language and converting
* them to a 4 bit value and storing the result into the returned
* integer.
*
* <p> This method is useful for mapping a set of string constants to
* a set of unique integers (e.g. mapping an enumerated type to an
* integer and back without having to require that the declaration
* order of the enumerated type remain constant for all time). The
* caller must, of course, ensure that no collisions occur.
*
* @param value the string to be encoded.
* @param encoded if non-null, a string buffer into which the
* characters used for the encoding will be recorded.
*/
public static int stringCode (String value, StringBuffer encoded)
{
int code = 0;
for (int ii = 0, uu = 0; ii < value.length(); ii++) {
char c = Character.toLowerCase(value.charAt(ii));
Integer cc = (Integer)_letterToBits.get(Character.valueOf(c));
if (cc == null) {
continue;
}
code += cc.intValue();
if (encoded != null) {
encoded.append(c);
}
if (++uu == 8) {
break;
}
code <<= 4;
}
return code;
}
/** Used to easily format floats with sensible defaults. */
protected static final NumberFormat _ffmt = NumberFormat.getInstance();
@@ -1354,4 +1400,30 @@ public class StringUtil
_ffmt.setMinimumFractionDigits(1);
_ffmt.setMaximumFractionDigits(2);
}
/** Used by {@link #hexlate} and {@link #unhexlate}. */
protected static final String XLATE = "0123456789abcdef";
/** Maps the 16 most frequent letters in the English language to a
* number between 0 and 15. Used by {@link #stringCode}. */
protected static final HashMap _letterToBits = new HashMap();
static {
_letterToBits.put(Character.valueOf('e'), Integer.valueOf(0));
_letterToBits.put(Character.valueOf('t'), Integer.valueOf(1));
_letterToBits.put(Character.valueOf('a'), Integer.valueOf(2));
_letterToBits.put(Character.valueOf('o'), Integer.valueOf(3));
_letterToBits.put(Character.valueOf('i'), Integer.valueOf(4));
_letterToBits.put(Character.valueOf('n'), Integer.valueOf(5));
_letterToBits.put(Character.valueOf('s'), Integer.valueOf(6));
_letterToBits.put(Character.valueOf('r'), Integer.valueOf(7));
_letterToBits.put(Character.valueOf('h'), Integer.valueOf(8));
_letterToBits.put(Character.valueOf('l'), Integer.valueOf(9));
_letterToBits.put(Character.valueOf('d'), Integer.valueOf(10));
_letterToBits.put(Character.valueOf('c'), Integer.valueOf(11));
_letterToBits.put(Character.valueOf('u'), Integer.valueOf(12));
_letterToBits.put(Character.valueOf('m'), Integer.valueOf(13));
_letterToBits.put(Character.valueOf('f'), Integer.valueOf(14));
_letterToBits.put(Character.valueOf('p'), Integer.valueOf(15));
// sorry g, w, y, b, v, k, x, j, q, z
}
}