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.splitdokumentacja mówi, że „końcowe puste łańcuchy nie są uwzględniane w wynikowej tablicy”.
String.splitzostał 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ę charprymitywó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();
cArrayprzywró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 charin a Stringmoż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ż toCharArraymusi 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ą charAtmetody.
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);