Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

is there a way to use tr/// (or equivalent) in java?

I would like to know if there is an equivalent to tr/// (as used in Perl) in Java. For example, if I wanted to replace all "s"s with "p"s in "mississippi" and vice versa, I could, in Perl, write

#shebang and pragmas snipped...
my $str = "mississippi";
$str =~ tr/sp/ps/;  # $str = "mippippissi"
print $str;

The only way I can think of to do it in Java is to use a dummy character with the String.replace() method, i.e.

String str = "mississippi";
str = str.replace('s', '#');   // # is just a dummy character to make sure
                               // any original 's' doesn't get switched to a 'p'
                               // and back to an 's' with the next line of code
                               // str = "mi##i##ippi"
str = str.replace('p', 's');   // str = "mi##i##issi"
str = str.replace('#', 'p');   // str = "mippippissi"
System.out.println(str);

Is there a better way to do this?

Thanks in advance.

like image 359
Limao Luo Avatar asked Sep 17 '11 21:09

Limao Luo


2 Answers

Commons' replaceChars may be your best bet. AFAIK there's no replacement (ar ar) in the JDK.

like image 180
Dave Newton Avatar answered Nov 14 '22 17:11

Dave Newton


Depending on how static your replacement is, you could do

char[] tmp = new char[str.length()];
for( int i=0; i<str.length(); i++ ) {
  char c = str.charAt(i);
  switch( c ) {
    case 's': tmp[i] = 'p'; break;
    case 'p': tmp[i] = 's'; break;
    default: tmp[i] = c; break;
  }
}
str = new String(tmp);

If the replacements need to vary at runtime, you could replace the switch with a table lookup (if you know that all the codepoints you need to replace fall into a limited range, such as ASCII), or, if everything else fails, a hashmap from Character to Character.

like image 45
hmakholm left over Monica Avatar answered Nov 14 '22 17:11

hmakholm left over Monica