Dizeyi karakter dizeleri dizisine bölme


Yanıtlar:


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

Bu üretecek

dizi ["c", "a", "t"]


8
Nasıl ve neden? Bu, herhangi bir karakter anlamına gelen bir normal ifade mi? Çünkü zihnimde, bölünmenin çalışma şekliyle, bu sadece gerçek karakterlere (,?,!, ^ Ve) bölünmelidir. Ancak, söylediğiniz gibi çalışır.
Ty_

3
Bu gerçekten de negatif önden okuma olarak adlandırılan bir normal ifade ifadesidir. Belgeleri buradan kontrol edin: docs.oracle.com/javase/6/docs/api/java/util/regex/…
Erwin

4
@ EW-CodeMonkey (?!... )olumsuz bir iddia için normal ifade sözdizimidir - içinde olanla hiçbir eşleşme olmadığını iddia eder. Ve ^dizenin başlangıcıyla eşleşir, böylece normal ifade, dizenin başlangıcı olmayan her konumla eşleşir ve oraya bir bölme ekler. Bu normal ifadenin aynı dize sonunda eşleşir ve böylece de olması dışında sonucuna boş bir dize ekleriz String.splitbelgelerine diyor "sondaki boş dizeler olarak dizide yer almayan".
Boann

8
Java 8 davranışı String.splitbiraz böylece değiştirilmiş olması gelen , aynı zamanda sonuç dizi dahil değildir sıfır genişliğine uygun üretilen boş dizeleri nedenle (?!^)Konum dizgenin başlangıç olmadığını iddia olur gereksiz için normal ifade sağlayan hiçbir şey olmayacak şekilde basitleştirilebilir - "cat".split("")- ama Java 7 ve daha düşük sürümlerde sonuç dizisinde baştaki boş bir dizge oluşturur.
Boann

1
Tüm bir dizeden oluşan bir dizi oluşturur.
Eduard

109
"cat".toCharArray()

Ama dizelere ihtiyacın varsa

"cat".split("")

Düzenleme: boş bir ilk değer döndürür.


12
"kedi" .split ("") [, c, a, t] döndürür, hayır? Dizinizde fazladan bir karakteriniz olacak ...
resif

4
"Cat" .split ("") Matt tarafından beklendiği gibi çalışmıyor, fazladan boş bir String => [, c, a, t] alacaksınız.
resif

5
Java 8 kullanıyorsanız bu yanıt artık işe yarıyor. Stackoverflow.com/a/22718904/1587046
Alexis

4
Bu jdk8'de korkunç bir değişiklikti çünkü ben split'e ("") güveniyordum ve bu aptalca boş ilk dizine geçici çözümler getirdim. Şimdi java8'e yükselttikten sonra, yıllar önce beklediğim gibi çalışıyor. maalesef şimdi geçici çözümüm kodumu kırıyor ... ggrrrr.
Marc

@Marc Muhtemelen .toCharArray()yine de kullanmalısınız ; regex'i önler ve bir dizi chartemel öğe döndürür, böylece daha hızlı ve daha hafif olur. Bu 1 karakterlik bir dizi ihtiyacımız garip dizeleri .
Boann

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

3
Nitpicking, orijinal soru bir Char dizisi değil, String dizisi ister. Ancak buradan bir String dizisi elde etmek oldukça kolaydır.
dsolimano

Evet, bir dizi karakterin nasıl elde edileceğini zaten biliyorum. Başka bir yolu yoksa, char dizisini yineleyip her birinden bir dize oluşturabilirim.
Matt

Nasıl cArraygeri dönersiniz String?
Bitmap

Doğru sözdizimi şöyle olacaktır: char [] cArray = str.ToCharArray ();
dbz

6

Girişte Temel Çok Dilli Düzlemin ötesinde karakterler bekleniyorsa (bazı CJK karakterleri, yeni emojiler ...), bu "a💫b".split("(?!^)")tür karakterleri böldüğü için (sonuçları içerdiği array ["a", "?", "?", "b"]) ve daha güvenli bir şey kullanılacağı için bu tür yaklaşımlar kullanılamaz:

"a💫b".codePoints()
    .mapToObj(cp -> new String(Character.toChars(cp)))
    .toArray(size -> new String[size]);

2

Bir String'i tek karakterli bir Dizeler dizisine dönüştürmenin etkili bir yolu, bunu yapmak olacaktır:

String[] res = new String[str.length()];
for (int i = 0; i < str.length(); i++) {
    res[i] = Character.toString(str.charAt(i));
}

Ancak, bu, charin Stringa'nın aslında bir Unicode kod noktasının yarısını temsil edebileceği gerçeğini hesaba katmaz . (Kod noktası BMP'de değilse.) Bununla başa çıkmak için kod noktalarında yinelemeniz gerekir ... ki bu daha karmaşıktır.

Bu yaklaşım kullanmaktan daha hızlı olacak String.split(/* clever regex*/)ve muhtemelen Java 8+ akışlarını kullanmaktan daha hızlı olacaktır. Muhtemelen bundan daha hızlı:

String[] res = new String[str.length()];
int 0 = 0;
for (char ch: str.toCharArray[]) {
    res[i++] = Character.toString(ch);
}  

Çünkü toCharArrayzorundadır kopyalamak yeni diziye karakterleri.


2

Diğer cevapları özetlemek gerekirse ...

Bu, tüm Java sürümlerinde çalışır:

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

Bu yalnızca Java 8 ve sonraki sürümlerde çalışır:

"cat".split("")

0

Belki String içeriğinden geçen bir for döngüsü kullanabilir ve charAtyöntemi kullanarak karakterleri karakterlere göre çıkarabilirsiniz .

ArrayList<String>Örneğin bir ile birleştirildiğinde , bireysel karakter dizinizi elde edebilirsiniz.


Belki tek ayak üstünde durup "Tanrı Kraliçeyi Korusun" şarkısını söyleyebilirsiniz. Üzgünüm ama bu doğru bile değil.
Stephen C

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

1
Bunun bir dizgeyi bir diziye böleceğinden emin misiniz? Sadece dizeyi ekrana yazdırıyorsunuz.
TDG

0

Orijinal dize içeriyorsa ek Unicode karakterleri , ardından split()olmaz işi, bu vekil çiftleri içine bu karakterleri böler olarak. Bu özel karakterleri doğru şekilde işlemek için şuna benzer bir kod çalışır:

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("(?!^)")dize vekil çiftler içeriyorsa doğru çalışmaz. Kullanmalısınız split("(?<=.)").

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

çıktı:

[花, a, b, 🌹, 🌺, 🌷]

0

Yayılma operatörü [ ...], dizedeki her karakter ile bir dizi oluşturur:

const cat= 'cat';
const arrayized = [...cat] // ['c', 'a', 't'];

console.log(arrayized);

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.