Есть ли способ использовать tr /// (или эквивалент) в Java? - PullRequest
14 голосов
/ 18 сентября 2011

Я хотел бы знать, существует ли в Java эквивалент tr /// (как используется в Perl).Например, если бы я хотел заменить все «s» на «p» в «Миссисипи» и наоборот, я мог бы в Perl написать

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

Единственный способ, которым я могу придумать:сделать это в Java означает использовать фиктивный символ с методом String.replace(), т.е.

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);

Есть ли лучший способ сделать это?

Заранее спасибо.

Ответы [ 3 ]

5 голосов
/ 18 сентября 2011

Commons ' replaceChars может быть вашим лучшим выбором.AFAIK, нет замены (ар ар) в JDK.

1 голос
/ 18 сентября 2011

В зависимости от того, насколько статична ваша замена, вы можете сделать

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);

Если замены должны меняться во время выполнения, вы можете заменить коммутатор поиском в таблице (если вы знаете, что все кодовые точки, которые вам нужно заменить, попадают в ограниченный диапазон, например, ASCII), или, если все остальное терпит неудачу , хэш-карта от Character до Character.

0 голосов
/ 05 февраля 2018

Как уже заметил @Dave, ближайшая замена -

Apache Commons StringUtils.replaceChars (String str, String searchChars, String replaceChars)

Выдержка из описания:

...
StringUtils.replaceChars(null, *, *)           = null
StringUtils.replaceChars("", *, *)             = ""
StringUtils.replaceChars("abc", null, *)       = "abc"
StringUtils.replaceChars("abc", "", *)         = "abc"
StringUtils.replaceChars("abc", "b", null)     = "ac"
StringUtils.replaceChars("abc", "b", "")       = "ac"
StringUtils.replaceChars("abcba", "bc", "yz")  = "ayzya"
StringUtils.replaceChars("abcba", "bc", "y")   = "ayya"
StringUtils.replaceChars("abcba", "bc", "yzx") = "ayzya"
...
...