Saya perlu membagi String menjadi array String karakter tunggal.
Misalnya, memisahkan "cat" akan menghasilkan array "c", "a", "t"
.split("")
akan melakukannya.
Saya perlu membagi String menjadi array String karakter tunggal.
Misalnya, memisahkan "cat" akan menghasilkan array "c", "a", "t"
.split("")
akan melakukannya.
Jawaban:
"cat".split("(?!^)")
Ini akan menghasilkan
larik ["c", "a", "t"]
(?!
... )
adalah sintaks regex untuk pernyataan negatif - ini menegaskan bahwa tidak ada kecocokan dari apa yang ada di dalamnya. Dan ^
mencocokkan awal string, sehingga ekspresi reguler cocok di setiap posisi yang bukan awal string, dan menyisipkan pemisahan di sana. Regex ini juga cocok di akhir string dan juga akan menambahkan string kosong ke hasil, kecuali bahwa String.split
dokumentasinya mengatakan "string kosong di belakang tidak disertakan dalam larik yang dihasilkan".
String.split
sedikit diubah sehingga string kosong utama yang dihasilkan oleh pencocokan lebar-nol juga tidak disertakan dalam larik hasil, sehingga (?!^)
pernyataan bahwa posisi bukan awal string menjadi tidak diperlukan, memungkinkan regex untuk disederhanakan menjadi tidak ada - "cat".split("")
- tetapi di Java 7 dan di bawahnya yang menghasilkan string kosong utama dalam larik hasil.
"cat".toCharArray()
Tetapi jika Anda membutuhkan string
"cat".split("")
Edit: yang akan mengembalikan nilai pertama yang kosong.
.toCharArray()
tetap menggunakan ; itu menghindari regex dan mengembalikan array char
primitif sehingga lebih cepat dan lebih ringan. Aneh jika membutuhkan larik string 1 karakter .
String str = "cat";
char[] cArray = str.toCharArray();
cArray
kembali ke String
?
Jika karakter di luar Basic Multilingual Plane diharapkan pada input (beberapa karakter CJK, emoji baru ...), pendekatan seperti "a💫b".split("(?!^)")
tidak dapat digunakan, karena mereka memecah karakter tersebut (hasil menjadi array ["a", "?", "?", "b"]
) dan sesuatu yang lebih aman harus digunakan:
"a💫b".codePoints()
.mapToObj(cp -> new String(Character.toChars(cp)))
.toArray(size -> new String[size]);
Cara efisien untuk mengubah String menjadi larik String satu karakter adalah dengan melakukan ini:
String[] res = new String[str.length()];
for (int i = 0; i < str.length(); i++) {
res[i] = Character.toString(str.charAt(i));
}
Namun, ini tidak memperhitungkan fakta bahwa a char
dalam aString
sebenarnya bisa mewakili setengah dari titik kode Unicode. (Jika titik kode tidak ada di BMP.) Untuk mengatasinya, Anda perlu mengulang melalui titik kode ... yang lebih rumit.
Pendekatan ini akan lebih cepat daripada menggunakan String.split(/* clever regex*/)
, dan mungkin akan lebih cepat daripada menggunakan aliran Java 8+. Kemungkinan lebih cepat dari ini:
String[] res = new String[str.length()];
int 0 = 0;
for (char ch: str.toCharArray[]) {
res[i++] = Character.toString(ch);
}
karena toCharArray
harus menyalin karakter ke array baru.
Mungkin Anda dapat menggunakan perulangan for yang melewati konten String dan mengekstrak karakter dengan karakter menggunakan charAt
metode ini.
Dikombinasikan dengan ArrayList<String>
contoh, Anda bisa mendapatkan larik karakter individual.
Jika string asli berisi karakter Unicode tambahan , maka split()
tidak akan berfungsi, karena itu membagi karakter ini menjadi pasangan pengganti. Untuk menangani karakter khusus ini dengan benar, kode seperti ini berfungsi:
String[] chars = new String[stringToSplit.codePointCount(0, stringToSplit.length())];
for (int i = 0, j = 0; i < stringToSplit.length(); j++) {
int cp = stringToSplit.codePointAt(i);
char c[] = Character.toChars(cp);
chars[j] = new String(c);
i += Character.charCount(cp);
}