Just as I started poking my nose into Python, I came across two really interesting functions in its string module.
maketrans()
translate()
These two methods when used together, can be used for string transformations based on a mapping between characters.
Java’s API didn’t seem to provide any equivalent for this. So I decided to write one just for kicks.
Note: This is not a RegEx based approach for replacing parts of a String. It uses a mapping table of characters to perform the transformation.
Here is a simple Java code to achieve what maketrans()
and translate()
achieve together in Python.
package translator;
import java.util.HashMap;
import java.util.Map;
public class StringTranslator {
private Map<Character, Character> translationMap;
public StringTranslator(String from, String to) {
translationMap = new HashMap<Character, Character>();
if (from.length() != to.length())
throw new IllegalArgumentException("The from and to strings must be of the same length");
for (int i = 0; i < from.length(); i++)
translationMap.put(from.charAt(i), to.charAt(i));
}
public String translate(String str) {
StringBuilder buffer = new StringBuilder(str);
for (int i = 0; i < buffer.length(); i++) {
Character ch = buffer.charAt(i);
Character replacement = translationMap.get(ch);
if (replacement != null)
buffer.replace(i, i + 1, "" + replacement);
}
return buffer.toString();
}
public String translate(String str, String deleteChars) {
StringBuilder buffer = new StringBuilder(str);
char[] deletions = deleteChars.toCharArray();
for (char ch : deletions) {
int index;
if ((index = buffer.indexOf("" + ch)) != -1)
buffer.deleteCharAt(index);
}
return translate(buffer.toString());
}
}
Once the above code is in place, here are the equivalent Python and Java code to achieve the same result.
"He!!0 W0r!d".translate(maketrans("!0", "lo"))
new StringTranslator("!0", "lo").translate("He!!0 W0r!d");
The constructor of the StringTranslator
class takes the from and to strings for
mapping like maketrans()
of Python. The overloaded translate()
methods take
the String
to be transformed and optionally another String
containing the
characters to be deleted (like translate()
of Python). The translation table
need not be passed as an argument in this case as the StringTranslator
instance will already hold it.
All opinions are my own. Copyright 2005 Chandra Sekar S.