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.splitdokumentasinya mengatakan "string kosong di belakang tidak disertakan dalam larik yang dihasilkan".
String.splitsedikit 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 charprimitif sehingga lebih cepat dan lebih ringan. Aneh jika membutuhkan larik string 1 karakter .
String str = "cat";
char[] cArray = str.toCharArray();
cArraykembali 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 chardalam 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 toCharArrayharus menyalin karakter ke array baru.
Mungkin Anda dapat menggunakan perulangan for yang melewati konten String dan mengekstrak karakter dengan karakter menggunakan charAtmetode 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);
}