Pisahkan string menjadi larik string karakter


Jawaban:


120
"cat".split("(?!^)")

Ini akan menghasilkan

larik ["c", "a", "t"]


8
Bagaimana dan mengapa? Apakah ini regex yang berarti karakter apa pun? Karena menurut saya, dengan cara kerja split, ini seharusnya hanya di split pada karakter sebenarnya (,?,!, ^, Dan). Namun, ini berfungsi seperti yang Anda katakan.
Ty_

3
Ini memang ekspresi regex, yang disebut pandangan negatif. Lihat dokumentasinya di sini: docs.oracle.com/javase/6/docs/api/java/util/regex/…
Erwin

4
@ EW-CodeMonkey (?!... )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".
Boann

8
Di Java 8, perilaku 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.
Boann

1
Ini menciptakan array dari seluruh string.
Eduard

109
"cat".toCharArray()

Tetapi jika Anda membutuhkan string

"cat".split("")

Edit: yang akan mengembalikan nilai pertama yang kosong.


12
"cat" .split ("") akan mengembalikan [, c, a, t], bukan? Anda akan memiliki karakter ekstra di Array Anda ...
reef

4
The "cat" .split ("") tidak bekerja seperti yang diharapkan oleh Matt, Anda akan mendapatkan String => [, c, a, t] kosong ekstra.
karang

5
Jawaban ini sekarang berfungsi jika Anda menggunakan Java 8. Lihat stackoverflow.com/a/22718904/1587046
Alexis C.25

4
Ini adalah perubahan yang mengerikan di jdk8 karena saya mengandalkan split ("") dan melakukan penyelesaian yang menyebabkan indeks pertama kosong yang konyol ini. Sekarang setelah memutakhirkan ke java8, ini berfungsi seperti yang saya harapkan bertahun-tahun yang lalu. sayangnya sekarang solusi saya memecahkan kode saya ... ggrrrr.
Marc

@Marc Anda mungkin harus .toCharArray()tetap menggunakan ; itu menghindari regex dan mengembalikan array charprimitif sehingga lebih cepat dan lebih ringan. Aneh jika membutuhkan larik string 1 karakter .
Boann

41
String str = "cat";
char[] cArray = str.toCharArray();

3
Nitpicking, pertanyaan asli meminta array String, bukan array Char. Namun cukup mudah untuk mendapatkan array String dari sini.
dsolimano

Ya, saya sudah tahu cara mendapatkan array karakter. Saya hanya bisa mengulang melalui array karakter dan membuat string dari masing-masing, jika tidak ada cara lain.
Matt

Bagaimana Anda akan cArraykembali ke String?
Bitmap

Sintaks yang benar adalah: char [] cArray = str.ToCharArray ();
dbz

6

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]);

2

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.


2

Untuk meringkas jawaban lainnya ...

Ini berfungsi pada semua versi Java:

"cat".split("(?!^)")

Ini hanya berfungsi di Java 8 dan yang lebih baru:

"cat".split("")

0

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.


Mungkin Anda bisa berdiri dengan satu kaki dan menyanyikan "God Save the Queen". Maaf, tapi ini bahkan tidak mendekati benar.
Stephen C

0
for(int i=0;i<str.length();i++)
{
System.out.println(str.charAt(i));
}

1
Apakah Anda yakin ini akan membagi string menjadi array? Anda baru saja mencetak string ke layar.
TDG

0

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);
}

0

split("(?!^)")tidak berfungsi dengan benar jika string berisi pasangan pengganti. Anda harus menggunakan split("(?<=.)").

String[] splitted = "花ab🌹🌺🌷".split("(?<=.)");
System.out.println(Arrays.toString(splitted));

keluaran:

[花, a, b, 🌹, 🌺, 🌷]
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.