Yanıtlar:
"cat".split("(?!^)")
Bu üretecek
dizi ["c", "a", "t"]
(?!
... )
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.split
belgelerine diyor "sondaki boş dizeler olarak dizide yer almayan".
String.split
biraz 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.
"cat".toCharArray()
Ama dizelere ihtiyacın varsa
"cat".split("")
Düzenleme: boş bir ilk değer döndürür.
.toCharArray()
yine de kullanmalısınız ; regex'i önler ve bir dizi char
temel öğe döndürür, böylece daha hızlı ve daha hafif olur. Bu 1 karakterlik bir dizi ihtiyacımız garip dizeleri .
String str = "cat";
char[] cArray = str.toCharArray();
cArray
geri dönersiniz String
?
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]);
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, char
in String
a'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ü toCharArray
zorundadır kopyalamak yeni diziye karakterleri.
Belki String içeriğinden geçen bir for döngüsü kullanabilir ve charAt
yöntemi kullanarak karakterleri karakterlere göre çıkarabilirsiniz .
ArrayList<String>
Örneğin bir ile birleştirildiğinde , bireysel karakter dizinizi elde edebilirsiniz.
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);
}
Yayılma operatörü [ ...
], dizedeki her karakter ile bir dizi oluşturur:
const cat= 'cat';
const arrayized = [...cat] // ['c', 'a', 't'];
console.log(arrayized);