をthisページchar
int
へのマッピングをチェックアウトし、何があなたに飛び出すかどうかを確認し、我々は文字我々が実装することができJava
で
[email protected]:~$ echo "abcdABCD1234" | tr "a-zA-Z0-9" "A-Za-zA-J"
ABCDabcdBCDE
[email protected]:~$
に代わるtr
コマンドを持っていますchar
public static void main(String[] args) {
String str = "abcdefghABCDEFGHI1234%*@)@*#&";
String from = "a-zA-Z0-9";
String to = "A-Za-zA-J";
final char remaining = '#';
String replaced = tr(from, to, remaining, str);
System.out.println(replaced);
}
private static String tr(String from, String to, char def, String str) {
Map<Character, Character> trMap = buildTRMap(from, to);
return str.chars().mapToObj(ch -> trMap.getOrDefault((char) ch, def) + "").collect(Collectors.joining());
}
private static Map<Character, Character> buildTRMap(String from, String to) {
Map<Character, Character> trMap = new HashMap<>();
for (int i = 0; i < from.length(); i++) {
if (i + 2 < from.length() && from.charAt(i + 1) == '-') {
char fromStart = from.charAt(i);
char fromEnd = from.charAt(i + 2);
char toStart = to.charAt(i);
char toEnd = to.charAt(i + 2);
List<Character> fromL = IntStream.rangeClosed(fromStart, fromEnd).mapToObj(c -> (char) c).collect(Collectors.toList());
List<Character> toL = IntStream.rangeClosed(toStart, toEnd).mapToObj(c -> (char) c).collect(Collectors.toList());
IntStream.range(0, fromL.size()).forEach(in -> trMap.put(fromL.get(in), toL.get(in)));
i += 2;
} else {
trMap.put(from.charAt(i), to.charAt(i));
}
}
return trMap;
}
出力
を交換する
tr
に類似
ABCDEFGHabcdefghiBCDE########
はあなたが提供しているJDKのAPIを使用するのではなく、自分自身のコードを書きたいことを意味していますか? –
Javaライブラリには、文字が大文字、小文字、または数字かどうかを判断するためのメソッドがjava.lang.Characterクラスにあります。それはあなたの人生をはるかに簡単にします。また、大文字と小文字に変換するメソッドもあります。数字を文字に変換するには、数字と文字の数値が同じ順序であるという事実に頼ることができます。 –
@ saka1029はい、そして?両方の例で正しいです。私はちょっと難しいかもしれない数字を推測します。おそらく 'ch> = '0' && ch <= '9''をチェックする方が良いかもしれませんが、文字の場合は問題にはなりません。大文字と小文字はそのように扱われます。 –