はじめに
charAt1文字を1変数(コードポイントで)に割り当てたい。
そんな要望からStringとint[]との相互変換を行ってみます。
使い方はお察し下さい。
文字列から数値配列へ
static public int[] toInteger(String text) { int textlength = text.length(); for (int i = 0, j = text.length(); i < j; i++) { if (Character.isHighSurrogate(text.charAt(i))) { textlength––; i++; } } int[] out = new int[textlength]; for (int i = 0, j = text.length(), p = 0; i < j; i++, p++) { int c = text.charAt(i); if (!Character.isHighSurrogate(text.charAt(i))) { out[p] = c; } else { out[p] = toCodePoint(c, text.charAt(i + 1)); i++; } } return (out); }
数値配列から文字列へ
static public String toString(int[] text) { StringBuilder out = new StringBuilder(); for (int i = 0, j = text.length; i < j; i++) { out.append(Character.toChars(text[i])); } return (out.toString()); }
サロゲートペアの判別方法
static public int getHighSurrogate(int x) { x -= 0×10000; x >>= 10; x += 0xD800; return (x); } static public int getLowSurrogate(int x) { x -= 0×10000; x &= 0x3FF; x += 0xDC00; return (x); } static public int toCodePoint(int high, int low) { high -= 0xD800; high <<= 10; low -= 0xDC00; low |= high; low += 0×10000; return (low); }
※ 「Character.toCodePoint」とかぶってた。
数値配列の検索
static public int indexOf(int[] in, int[] target, int offset) { final int ilength = in.length – target.length + 1; final int tlength = target.length; // 高速化のために頭の文字だけ配列からだしておく final int sento = target[0]; if (offset >= ilength) { return (-1); } // 検索対象が1文字の場合 int i; if (tlength == 0) { for (i = offset; i < ilength; i++) { if (in[i] == sento) { return (i); } } return (-1); } // 検索対象が複数の場合 int j; for (i = offset; i < ilength; i++) { if (in[i] == sento) { i++; for (j = 1; j < tlength; j++, i++) { if (in[i] != target[j]) { break; } } if (j == tlength) { return (i – tlength); } else { i -= j; } } } return (-1); }
数値配列の置換
static public int[] getReplace(int[] in, int[] target, int[] replacement) { if ((target.length == replacement.length) && (target.length == 1)) { int tgt = target[0]; int rep = replacement[0]; int[] out = new int[in.length]; System.arraycopy(in, 0, out, 0, in.length); for (int i = in.length – 1; i >= 0; i–) { if (out[i] == tgt) { out[i] = rep; } } return (out); } else if (target.length < replacement.length) { return (toInteger(toString(in).replace(toString(target), toString(replacement)))); } int[] out = new int[in.length]; int ilength = in.length; int tlength = target.length; int rlength = replacement.length; int inpoint = 0, outpoint = 0, index; while (true) { index = indexOf(in, target, inpoint); if (index == -1) { System.arraycopy(in, inpoint, out, outpoint, ilength – inpoint); outpoint += ilength – inpoint; break; } System.arraycopy(in, inpoint, out, outpoint, index – inpoint); outpoint += index – inpoint; inpoint += index – inpoint; System.arraycopy(replacement, 0, out, outpoint, rlength); inpoint += tlength; outpoint += rlength; } if (outpoint != ilength) { int[] out2 = new int[outpoint]; System.arraycopy(out, 0, out2, 0, outpoint); return (out2); } return (out); }
コメント