思想私は、foreach文(ref)と連携し、回避策メソッドを追加したい、プラスは、Java 8に移動するとき、あなたは簡単にJavaの8の新しいString#コードポイント方式に変換することができます。そして、
public static Iterable<Integer> codePoints(final String string) {
return new Iterable<Integer>() {
public Iterator<Integer> iterator() {
return new Iterator<Integer>() {
int nextIndex = 0;
public boolean hasNext() {
return nextIndex < string.length();
}
public Integer next() {
int result = string.codePointAt(nextIndex);
nextIndex += Character.charCount(result);
return result;
}
public void remove() {
throw new UnsupportedOperationException();
}
};
}
};
}
あなただけ(上記のアプローチよりも多くのRAMを使用する場合があります)intの配列に文字列を変換したい場合は
for(int codePoint : codePoints(myString)) {
....
}
または交互に:あなたはこのようなforeachのでそれを使用することができます
public static List<Integer> stringToCodePoints(String in) {
if(in == null)
throw new NullPointerException("got null");
List<Integer> out = new ArrayList<Integer>();
final int length = in.length();
for (int offset = 0; offset < length;) {
final int codepoint = in.codePointAt(offset);
out.add(codepoint);
offset += Character.charCount(codepoint);
}
return out;
}
"高価な"かどうかは、うーん... Javaに組み込まれている方法は他にありません。しかし、Latin/European/Cyrillic/Greek/Hebrew/Arabicスクリプトだけを扱っているのであれば、s.charAt()を心臓のコンテンツに追加するだけです。 :) –
しかし、あなたはすべきではありません。例えば、あなたのプログラムがXMLを出力し、誰かがあいまいな数学演算子を与えた場合、あなたのXMLは突然無効になるかもしれません。 –
@Jonathan Feinbergそれは私が思ったことです。しかし、ここでは特別な数学的なE. UTF-16が99%の時間で働いていますが、それは本当に痛いものです。特に問題が長い間隠されていた場合。 – Martin