Mam długiego Stringa i chciałbym wyświetlić go podając jakiejś metodzie dodatkowy parametr, który by określił ile znaków wyświetlić w jednym wierszu. Istnieje taka metoda?
Java to nie NodeJS zeby do jednej linijki kodu była potrzebna biblioteka. Można by do tego użyć czegoś z Guavy albo Apache Commons, ale mozesz też napisać to samemu.
String ma metodę substring
która wydziela z niego kawałek.
public static Stream<String> chunk(String input, int size) {
int numberOfChunks = ((input.length() + size - 1) / size);
return IntStream.range(0, numberOfChunks)
.mapToObj(idx -> input.substring(idx * size, Math.min((idx + 1) * size, input.length())));
}
Wiemy że takich chunków będziemy mieli length/size +-1 w zależności od tego czy string ma długość która jest wielokrotnością size
czy nie. Dalej wiemy że dla każdego i-tego
chunka chcemy wykroić kawałek od size*i
do size*(i+1)
.
Ten min
na końcu bo javowy subtring jest słaby i nie lubi jak damy mu index dalszy niż koniec stringa, wiec ostatni chunk trzeba przyciąć.
Teraz możesz zrobić jakieś:
String data = "some very long string";
String chunkedAndJoined = chunk(data, 2).collect(Collectors.joining("\n"));
haracz napisał(a):
Mam długiego Stringa i chciałbym wyświetlić go podając jakiejś metodzie dodatkowy parametr, który by określił ile znaków wyświetlić w jednym wierszu. Istnieje taka metoda?
O rany, co ten Shalom tam jakaś znowu matematykę wyższą naklepał, tu masz w pythonowym stylu (może i działa 5 razy wolniej, ale za to gorzej).
import java.util.Arrays;
System.out.println(String.join("\n", Arrays.asList("Hello World! Hello World! Hello World!".split("(?<=\\G.{7})"))));
Tylko nie pytaj mnie jak ten regex działa, znalazłem na SO. Tylko głupi by nie ukradł.
Dzięki Panowie, wypróbowałem oba sposoby i działają, ale nie wziąłem pod uwagę paru rzeczy. Ten String to słowa i trzeba mieć na uwadze spacje między słowami, żeby nie ucięło wyrazu w połowie. Druga kwestia jest taka, że przejście do nowej linii nie powinno kończyć się pojedynczą literą. I kolejna rzecz - w tekście są już entery, które wskazują na koniec akapitu i te entery musiały by zostać na swoim miejscu niepowielone kolejnym enterem. I pytanie czy jakbym potem robił interfejs graficzny w JavaFX musiałbym wykorzystać te same metody czy w JavaFX istnieje coś takiego jak zawijanie wierszy w zależności od wielkości pola tekstowego?
Namieszałem? ;)
haracz napisał(a):
Dzięki Panowie, wypróbowałem oba sposoby i działają, ale nie wziąłem pod uwagę paru rzeczy. Ten String to słowa i trzeba mieć na uwadze spacje między słowami, żeby nie ucięło wyrazu w połowie. Druga kwestia jest taka, że przejście do nowej linii nie powinno kończyć się pojedynczą literą. I kolejna rzecz - w tekście są już entery, które wskazują na koniec akapitu i te entery musiały by zostać na swoim miejscu niepowielone kolejnym enterem. I pytanie czy jakbym potem robił interfejs graficzny w JavaFX musiałbym wykorzystać te same metody czy w JavaFX istnieje coś takiego jak zawijanie wierszy w zależności od wielkości pola tekstowego?
Namieszałem? ;)
obczaj po pierwsze: https://howtodoinjava.com/java/string/4-ways-to-split-tokenize-strings-in-java/
Niestety nie znam JavyFX i nie mam ochoty jej poznawać, może jest tam jakiś magiczny sposób na automatyczne zawijanie wyrazów w okienku.
ale nie wziąłem pod uwagę paru rzeczy
xD @haracz dokładnie tak wygląda zbieranie wymagań w pracy :D Klient mówi ze on chce tylko pociąć stringa na kawałki o długości X, a potem okazuje się że w zasadzie to jest prawie ok, tylko trzeba dograć kilka szczegółów. Przypuszczam ze jakiś komponent od pola tekstowego będzie miał wbudowany taki ficzer.