Muszę podzielić ciąg znaków na tablicę ciągów pojedynczych znaków.
Np. Rozdzielenie „cat” dałoby tablicę „c”, „a”, „t”
.split("")
zrobi to.
Muszę podzielić ciąg znaków na tablicę ciągów pojedynczych znaków.
Np. Rozdzielenie „cat” dałoby tablicę „c”, „a”, „t”
.split("")
zrobi to.
Odpowiedzi:
"cat".split("(?!^)")
To wyprodukuje
tablica ["c", "a", "t"]
(?!
... )
to składnia wyrażenia regularnego dla twierdzenia negatywnego - zapewnia, że nie ma dopasowania tego, co jest w środku. I ^
dopasowuje początek łańcucha, więc wyrażenie regularne dopasowuje się w każdej pozycji, która nie jest początkiem ciągu, i wstawia tam podział. To wyrażenie regularne również pasuje na końcu łańcucha, więc do wyniku dołączy również pusty ciąg, z wyjątkiem tego, że String.split
dokumentacja mówi, że „końcowe puste łańcuchy nie są uwzględniane w wynikowej tablicy”.
String.split
został nieznacznie zmieniony tak, że prowadząc pustych strun produkowanych przez zerowej szerokości meczu także nie są zawarte w tablicy wyników, więc (?!^)
twierdzenie, że pozycja nie jest początkiem łańcucha staje się zbędne, umożliwiając regex być uproszczone do zera - "cat".split("")
- ale w Javie 7 i niższych generuje początkowy pusty ciąg w tablicy wyników.
"cat".toCharArray()
Ale jeśli potrzebujesz sznurków
"cat".split("")
Edycja: która zwróci pustą pierwszą wartość.
.toCharArray()
; unika wyrażeń regularnych i zwraca tablicę char
prymitywów, dzięki czemu jest szybsza i lżejsza. To dziwne, że potrzebna jest tablica jednoznakowych ciągów .
String str = "cat";
char[] cArray = str.toCharArray();
cArray
przywrócił String
?
Jeśli na wejściu spodziewane są postacie spoza Basic Multilingual Plane (niektóre postacie CJK, nowe emoji ...), "a💫b".split("(?!^)")
nie można zastosować podejść takich jak , ponieważ łamią takie znaki (skutkuje array ["a", "?", "?", "b"]
) i należy użyć czegoś bezpieczniejszego:
"a💫b".codePoints()
.mapToObj(cp -> new String(Character.toChars(cp)))
.toArray(size -> new String[size]);
Skutecznym sposobem przekształcenia String w tablicę jednoznakowych Ciągów byłoby zrobienie tego:
String[] res = new String[str.length()];
for (int i = 0; i < str.length(); i++) {
res[i] = Character.toString(str.charAt(i));
}
Jednak nie uwzględnia to faktu, że a char
in a String
może w rzeczywistości reprezentować połowę punktu kodowego Unicode. (Jeśli punkt kodowy nie znajduje się w BMP.) Aby sobie z tym poradzić, musisz iterować przez punkty kodowe ... co jest bardziej skomplikowane.
To podejście będzie szybsze niż używanie String.split(/* clever regex*/)
i prawdopodobnie będzie szybsze niż używanie strumieni Java 8+. Prawdopodobnie szybciej niż to:
String[] res = new String[str.length()];
int 0 = 0;
for (char ch: str.toCharArray[]) {
res[i++] = Character.toString(ch);
}
ponieważ toCharArray
musi skopiować znaki do nowej tablicy.
Może możesz użyć pętli for, która przechodzi przez zawartość String i wyodrębnia znaki po znakach za pomocą charAt
metody.
W połączeniu z ArrayList<String>
na przykład możesz uzyskać tablicę pojedynczych znaków.
Jeśli oryginalny ciąg zawiera dodatkowe znaki Unicode , split()
nie zadziała, ponieważ dzieli te znaki na pary zastępcze. Aby poprawnie obsługiwać te znaki specjalne, działa taki kod:
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);
}
Operator spreadu [ ...
] tworzy tablicę z każdym znakiem w ciągu:
const cat= 'cat';
const arrayized = [...cat] // ['c', 'a', 't'];
console.log(arrayized);