horiuchi #5672(2008/02/03 15:26 GMT) [ Java ] Rating1/1=1.00
(2)拡張版 を実装してみました。replaceが短い場合には、最後の文字を拡張して当てはめるようにしています(Perlのtrと同じ仕様)。また、同じ文字がsearch側に複数回していされた場合は最初の指定だけが有効になります。
#5650 と違い、サロゲートペアには対応できてません。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
import java.util.HashMap; import java.util.Map; public class Sample148 { private final Map<Character, Character> trMap_ = new HashMap<Character, Character>(); public Sample148(String search, String replace) { for (int index = 0, len = search.length(); index < len; index++) { char key = search.charAt(index); if (0 < index && index < len - 1 && key == '-') { trRange(search.charAt(index - 1), search.charAt(index + 1), replace.charAt(index - 1), replace.charAt(index + 1)); index++; } else { if (!trMap_.containsKey(key)) { trMap_.put(key, replace.charAt(index)); } } } } private void trRange(char startKey, char endKey, char startVal, char endVal) { for (int offset = 0; offset <= endKey - startKey; offset++) { char key = slide(startKey, offset); if (!trMap_.containsKey(key)) { char val = slide(startVal, offset); if (val > endVal) val = endVal; trMap_.put(key, val); } } } private char slide(char org, int offset) { return (char) (org + offset); } public String tr(String str) { StringBuilder builder = new StringBuilder(); for (char c: str.toCharArray()) { if (trMap_.containsKey(c)) { builder.append(trMap_.get(c)); } else { builder.append(c); } } return builder.toString(); } public static void main(String[] args) { System.out.println(new Sample148("qwertyuiop", "QWERTYUIOP").tr("typewriter")); System.out.println(new Sample148("a-z", "A-Z").tr("typewriter")); System.out.println(new Sample148("a-z", "A-X").tr("vwxyz")); } }
Rating1/1=1.00-0+
[ reply ]
horiuchi
#5672()
[
Java
]
Rating1/1=1.00
(2)拡張版 を実装してみました。replaceが短い場合には、最後の文字を拡張して当てはめるようにしています(Perlのtrと同じ仕様)。また、同じ文字がsearch側に複数回していされた場合は最初の指定だけが有効になります。
#5650 と違い、サロゲートペアには対応できてません。
Rating1/1=1.00-0+
[ reply ]