はじめに

charAt1文字を1変数(コードポイントで)に割り当てたい。
そんな要望からStringint[]との相互変換を行ってみます。
使い方はお察し下さい。

文字列から数値配列へ

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

関連記事

  • Bresenhamアルゴリズムで線分の計算は早いのかなBresenhamアルゴリズムで線分の計算は早いのかな 以前、直線を描くのにこんなのを作った。 特に工夫点もない、素直な方法である。 #module "linem" #deffunc line2 int line_x1,int line_y1,int line_x2,int line_y2 line_xabs = abs(line_x1-line_x2) line_yabs = […] Posted in アルゴリズム
  • Java1.6の速度調査(2009/12/02)Java1.6の速度調査(2009/12/02) はじめに Javaの速度を調べてみました。iはint型です。 代入先に書いてある型名は、代入した時の変数の型。 速度を表す値の単位は気にしないでください。相対的に見ていく感じでお願いします。 環境 Intel(R) Pentium(R) 4 CPU 3.00GHz 0.99GB RAM WindowsXP SP3 Java(TM) SE Runtime […] Posted in プログラミング
  • RSA暗号の解説に出てくる数値の逆数のmodRSA暗号の解説に出てくる数値の逆数のmod RSA暗号に紹介には、必ず次のような式がでてきます。 これ 今日は、この式について解説します。 といっても・・・すみません。言い訳になりますが、 数学科出身ではなく、間違ったこというかもしれません。 それをふまえていただいて・・・解説させていただきます。 まず、m = (p - 1)(q - 1) […] Posted in アルゴリズム
  • Javaで3Dゲーム開発日記 part5 画像補間Javaで3Dゲーム開発日記 part5 画像補間 以前の続きでテクスチャのパーリンノイズの補間法の話です。 いい加減補間について調べようといろいろとプログラムして作ってみました。 テクスチャなので、上下と左右が繋がるように補間します。 8x8px → 256x256px […] Posted in ゲーム制作
  • Eclipseから実行可能JAR作成とProGuardの難読化の一連の流れEclipseから実行可能JAR作成とProGuardの難読化の一連の流れ Eclipseを使ってJavaアプリケーションを作成して、 それを公開用のjarファイル作成までの流れを簡単に説明します。 まずは、単純に実行可能のJARファイルの作成方法です。 1. Eclipse で「ファイル(F)」→「エクスポート(O)...」を選択する。 2. 「Java」→「実行可能 JAR ファイル」を選んで「次へ(N) >」を選択する。 3. […] Posted in プログラミング
  • 「BufferedImage」の TYPE_4BYTE_ABGR から TYPE_INT_ARGB にする方法「BufferedImage」の TYPE_4BYTE_ABGR から TYPE_INT_ARGB にする方法 Java の BufferedImage は getType() を使うことでタイプを知ることが出来ます。 byte型でABGRの順に記録されている場合は、BufferedImage.TYPE_4BYTE_ABGR int型でARGBが記録されている場合は、BufferedImage.TYPE_INT_ARGB になります。 TYPE_4BYTE_ABGR […] Posted in プログラミング