Jadi saya tahu String#codePointAt(int)
, tapi itu diindeks oleh char
offset, bukan oleh titik kode offset.
Saya sedang berpikir untuk mencoba sesuatu seperti:
- gunakan
String#charAt(int)
untuk mendapatkanchar
di indeks - menguji apakah
char
berada dalam kisaran pengganti tinggi- jika demikian, gunakan
String#codePointAt(int)
untuk mendapatkan titik kode, dan naikkan indeks sebesar 2 - jika tidak, gunakan nilai yang diberikan
char
sebagai titik kode, dan tingkatkan indeks sebesar 1
- jika demikian, gunakan
Tapi kekhawatiran saya
- Saya tidak yakin apakah titik kode yang secara alami berada dalam kisaran pengganti tinggi akan disimpan sebagai dua
char
nilai atau satu - ini sepertinya cara yang sangat mahal untuk mengulang melalui karakter
- seseorang pasti telah menemukan sesuatu yang lebih baik.
offset = s.offsetByCodePoints(offset, 1);
. Apakah ada keuntungan dalam menggunakanoffset += Character.charCount(codepoint);
sebagai gantinya?charAt()
yang merupakan ide yang burukJava 8 ditambahkan
CharSequence#codePoints
yang mengembalikan yangIntStream
berisi poin kode. Anda dapat menggunakan aliran langsung untuk mengulanginya:atau dengan perulangan for dengan mengumpulkan aliran ke dalam array:
Cara-cara ini mungkin lebih mahal daripada solusi Jonathan Feinbergs , tetapi lebih cepat untuk membaca / menulis dan perbedaan kinerjanya biasanya tidak signifikan.
sumber
for (int c : (Iterable<Integer>) () -> string.codePoints().iterator())
juga bekerja.for (int c : (Iterable<Integer>) string.codePoints()::iterator) ...
Iterasi atas poin kode diajukan sebagai permintaan fitur di Sun.
Lihat Sun Bug Entry
Ada juga contoh tentang bagaimana melakukan iterasi melalui String CodePoints di sana.
sumber
Pikir saya akan menambahkan metode solusi yang bekerja dengan foreach loop ( ref ), ditambah Anda dapat mengonversinya ke metode String # codePoints baru java 8 dengan mudah ketika Anda pindah ke java 8:
Anda dapat menggunakannya dengan foreach seperti ini:
Inilah helper mthod:
Atau secara bergantian jika Anda hanya ingin mengonversi string menjadi larik int (yang mungkin menggunakan lebih banyak RAM daripada pendekatan di atas):
Untungnya, menggunakan "codePoints" dengan aman menangani pasangan pengganti UTF-16 (representasi string internal java).
sumber