Java: jak podzielić ciąg według liczby znaków?


Próbowałem przeszukać Internet, aby rozwiązać ten problem, ale nie mogłem nic znaleźć.
Napisałem następujący abstrakcyjny kod, aby wyjaśnić, o co pytam:
String text = "how are you?";String[] textArray= text.splitByNumber(4);//this method is what I'm asking
textArray[0];//it contains "how "
textArray[1];//it contains "are "
textArray[2];//it contains "you?"

Metoda splitByNumber dzieli ciąg „tekst” na 4 znaki. Jak mogę stworzyć tę metodę?
Wielkie dzięki
Zaproszony:
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Myślę, że chce mieć podzielony ciąg w podciągach o rozmiarze 4. Następnie zrobiłbym to w pętli:
List<String> strings = new ArrayList<String>();
int index = 0;
while (index < text.length()) {
strings.add(text.substring(index, Math.min(index + 4,text.length())));
index += 4;
}
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Za pomocą

Guawa
http://google.github.io/guava/ ... -int-
:
Iterable<String> result = Splitter.fixedLength(4).split("how are you?");
String[] parts = Iterables.toArray(result, String.class);
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

A co z wyrażeniem regularnym?
public static String[] splitByNumber(String str, int size) {
return (size<1 || str==null) ? null : str.split("(?<=\\G.{"+size+"})");
}

Zobacz linię

Podziel na równe podciągi w Javie
https://coderoad.ru/3760152/
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Korzystanie z prostych prymitywów i pętli Java.
private static String[] splitByNumber(String text, int number) { int inLength = text.length();
int arLength = inLength/number;
int left=inLength%number;
if(left>0){++arLength;}
String ar[] = new String[arLength];
String tempText=text;
for (int x = 0; x < arLength; ++x) { if(tempText.length()>number){
ar[x]=tempText.substring(0, number);
tempText=tempText.substring(number);
}else{
ar[x]=tempText;
} }
return ar;
}

Sposób użycia:
String ar [] = splitByNumber ("nalaka", 2);
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Spróbuj tego
String text = "how are you?";
String array[] = text.split(" ");

Lub możesz go użyć poniżej
List<String> list= new ArrayList<String>();
int index = 0;
while (index<text.length()) {
list.add(text.substring(index, Math.min(index+4,text.length()));
index=index+4;
}
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Fast Hack
private String[] splitByNumber(String s, int size) {
if(s == null || size <= 0)
return null;
int chunks = s.length()/size + ((s.length() % size > 0) ? 1 : 0);
String[] arr = new String[chunks];
for(int i = 0, j = 0, l = s.length(); i < l; i += size, j++)
arr[j] = s.substring(i, Math.min(l, i + size));
return arr;
}
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Nie sądzę, aby było gotowe rozwiązanie, ale zrobiłbym coś takiego:
private String[] splitByNumber(String s, int chunkSize){
int chunkCount = (s.length()/chunkSize) + (s.length() % chunkSize == 0 ? 0 : 1);
String[] returnVal = new String[chunkCount];
for(int i=0;i<chunkCount;i++){
returnVal[i] = s.substring(i*chunkSize, Math.min((i+1)*chunkSize-1, s.length());
}
return returnVal;
}

Sposób użycia będzie:
String[] textArray = splitByNumber(text, 4);

EDYCJA: Właściwie podciąg nie może przekraczać długości ciągu.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

To najprostsze rozwiązanie, jakie przyszło mi do głowy ... spróbuj tego
public static String[] splitString(String str) {
if(str == null) return null; List<String> list = new ArrayList<String>();
for(int i=0;i < str.length();i=i+4){
int endindex = Math.min(i+4,str.length());
list.add(str.substring(i, endindex));
}
return list.toArray(new String[list.size()]);
}
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Oto zwięzła implementacja wykorzystująca strumienie Java8:
String text = "how are you?";
final AtomicInteger counter = new AtomicInteger(0);
Collection<String> strings = text.chars()
.mapToObj(i -> String.valueOf((char)i) )
.collect(Collectors.groupingBy(it -> counter.getAndIncrement()/4
,Collectors.joining()))
.values();

Wyjście:
[how , are , you?]
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Wypróbuj to rozwiązanie,
public static String[]chunkStringByLength(String inputString, int numOfChar) {
if (inputString == null || numOfChar <= 0)
return null;
else if (inputString.length() == numOfChar)
return new String[]{
inputString
}; int chunkLen = (int)Math.ceil(inputString.length()/numOfChar);
String[]chunks = new String[chunkLen + 1];
for (int i = 0; i <= chunkLen; i++) {
int endLen = numOfChar;
if (i == chunkLen) {
endLen = inputString.length() % numOfChar;
}
chunks[i] = new String(inputString.getBytes(), i * numOfChar, endLen);
} return chunks;
}
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Moja aplikacja używa zamiany tekstu na mowę!
Oto mój algorytm do dzielenia przez „kropkę” i łączenia ciągu, jeśli jego długość jest mniejsza niż limit
String[] text = sentence.split("\\.");
ArrayList<String> realText = sentenceSplitterWithCount(text);

Funkcja SentenceSplitterWithCount: (łączę ciąg o długości mniejszej niż 100 znaków, to zależy od Ciebie)
private ArrayList<String> sentenceSplitterWithCount(String[] splittedWithDot){ ArrayList<String> newArticleArray = new ArrayList<>();
String item = "";
for(String sentence : splittedWithDot){ item += DataManager.setFirstCharCapitalize(sentence)+"."; if(item.length() > 100){
newArticleArray.add(item);
item = "";
} } for (String a : newArticleArray){
Log.d("tts", a); } return newArticleArray;
}

Funkcja setFirstCharCapitalize po prostu zamień pierwszą literę na wielką: myślę, że i tak nie potrzebujesz tego
public static String setFirstCharCapitalize(String input) {
if(input.length()>2) {
String k = checkStringStartWithSpace(input);
input = k.substring(0, 1).toUpperCase() + k.substring(1).toLowerCase();
} return input;
}

Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się