คิดว่าฉันจะเพิ่มวิธีการแก้ปัญหาที่ใช้ได้กับ foreach loops ( ref ) รวมทั้งคุณสามารถแปลงเป็นวิธีString # codePointsใหม่ของ java 8 ได้อย่างง่ายดายเมื่อคุณย้ายไปที่ java 8:
คุณสามารถใช้กับ foreach ดังนี้:
for(int codePoint : codePoints(myString)) {
....
}
นี่คือผู้ช่วย mthod:
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();
}
};
}
};
}
หรืออีกทางเลือกหนึ่งหากคุณต้องการแปลงสตริงเป็นอาร์เรย์ของ int (ซึ่งอาจใช้ RAM มากกว่าวิธีการข้างต้น):
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;
}
โชคดีที่ใช้ "codePoints" จัดการคู่ตัวแทนของ UTF-16 อย่างปลอดภัย (การแสดงสตริงภายในของ java)