Czy w Javie istnieje sposób na utworzenie łańcucha o określonej liczbie określonego znaku? W moim przypadku musiałbym utworzyć ciąg z 10 spacjami. Mój obecny kod to:
StringBuffer outputBuffer = new StringBuffer(length);
for (int i = 0; i < length; i++){
outputBuffer.append(" ");
}
return outputBuffer.toString();
Czy istnieje lepszy sposób na osiągnięcie tego samego. W szczególności chciałbym coś, co jest szybkie (pod względem wykonania).
java
string
stringbuffer
Krzyż
źródło
źródło
append(' ')
zamiast tego ... wymaga to trochę mniej przetwarzania ...Odpowiedzi:
Pętla for zostanie zoptymalizowana przez kompilator. W takich przypadkach jak Twój nie musisz samodzielnie zajmować się optymalizacją. Zaufaj kompilatorowi.
Swoją drogą, jeśli istnieje sposób na utworzenie łańcucha zawierającego n znaków spacji, jest on zakodowany w taki sam sposób, jak przed chwilą.
źródło
static Dictionary<int, String>
?" ".substring(0, 10);
Prawdopodobnie najkrótszy kod korzystający
String
wyłącznie z interfejsu API:Jako metoda, bez bezpośredniego tworzenia instancji
char
:Wywołaj za pomocą:
źródło
Hmm teraz, kiedy o tym myślę, może
Arrays.fill
:Oczywiście zakładam, że
fill
metoda robi to samo, co twój kod, więc prawdopodobnie będzie działać mniej więcej tak samo, ale przynajmniej jest to mniej wierszy.źródło
Arrays.fill()
funkcja jest konsekwentnie używana do wykonywania tej pracy w kodzie i (standardowym i zewnętrznym) kodzie biblioteki, to jest dobrym kandydatem do kompilacji Hotspot i ma większe szanse na znalezienie pamięci podręcznej procesora. Przyszłe maszyny JVM mogą przypisać to jako wewnętrzną funkcję.Gorąco radzę nie pisać pętli ręcznie. Będziesz to robić w kółko w trakcie swojej kariery programistycznej. Osoby czytające Twój kod - w tym również Ciebie - zawsze muszą poświęcić czas, nawet jeśli jest to tylko kilka sekund, aby przetrawić znaczenie pętli.
Zamiast tego użyj jednej z dostępnych bibliotek dostarczających kod, który robi to samo, jak
StringUtils.repeat
z Apache Commons Lang :W ten sposób nie musisz martwić się o wydajność, dlatego wszystkie krwawe szczegóły
StringBuilder
, optymalizacje kompilatora itp. Są ukryte. Gdyby funkcja działała tak wolno, byłby to błąd w bibliotece.Dzięki Java 11 staje się to jeszcze łatwiejsze:
źródło
W Javie 8 możesz użyć
String.join
:źródło
Jeśli chcesz tylko spacje, co powiesz na:
co da w wyniku abs (n) spacje;
źródło
od wersji Java 11 :
od wersji Java 8 :
gdzie:
źródło
Od wersji Java 11 możesz po prostu użyć go
String.repeat(count)
do rozwiązania problemu.Więc zamiast pętli, twój kod wyglądałby tak:
źródło
Myślę, że jest to mniej kodu, jaki jest możliwy, używa klasy Guava Joiner:
źródło
pubic String n(int n) { ... }
która pozwoli na użycie nawet „mniejszej” ilości kodu:n(10)
ale znowu nie ma to żadnego sensu.Możesz użyć standardowej
String.format
funkcji do wygenerowania N przestrzeni. Na przykład:Tworzy ciąg z 5 spacjami.
lub
Tworzy ciąg 15 spacji.
Jeśli chcesz powtórzyć inny symbol, musisz zastąpić spacje żądanym symbolem:
Wynik:
źródło
Mój wkład oparty na algorytmie szybkiego potęgowania.
Przetestowałem algorytm na dwóch innych podejściach:
String.concat()
do łączenia łańcuchaStringBuilder
Kod testowy (konkatenacja za pomocą pętli for i
String.concat()
staje się wolniejsza dla dużychn
, więc pominąłem go po 5. iteracji).Wyniki:
Wniosek:
n
- użyj podejścia rekurencyjnegon
- pętla ma wystarczającą prędkośćźródło
if
stwierdzenia zepsują przewidywanie gałęzi procesora. Naprawdę należy to powtórzyć za pomocą JMH ( openjdk.java.net/projects/code-tools/jmh ), w przeciwnym razie jest to trochę bezcelowe.Co powiesz na to?
źródło
Biorąc pod uwagę, że mamy:
Java 8 (przy użyciu strumienia)
Java 8 (przy użyciu nCopies)
źródło
Collectors.joining(EMPTY_STRING)
jest odpowiednikiemCollectors.joining()
RandomStringUtils ma przepis umożliwiający utworzenie ciągu z podanego rozmiaru wejściowego. Nie mogę komentować prędkości, ale to jedna linijka.
tworzy wynik
najlepiej jeśli nie chcesz widzieć \ 0 w swoim kodzie.
źródło
Użyj StringUtils: StringUtils.repeat (``, 10)
źródło
W większości przypadków potrzebujesz tylko Ciągów o określonej długości, powiedzmy 100 spacji. Możesz przygotować tablicę ciągów, w której numer indeksu jest równy rozmiarowi wypełnionego spacjami ciągu i wyszukać ciąg, jeśli wymagana długość mieści się w granicach, lub utworzyć go na żądanie, jeśli znajduje się poza granicami.
źródło
Najkrótsze rozwiązanie z guawą:
Poprzez prosty sposób powtórzyć ciąg w java .
źródło
Po prostu zamień swój StringBuffer na StringBuilder . Trudno to przebić.
Jeśli twoja długość jest dużą liczbą, możesz zaimplementować bardziej wydajne (ale bardziej niezgrabne) automatyczne dodawanie, powielające długość w każdej iteracji:
Możesz również wypróbować
Arrays.fill()
podejście (odpowiedź FrustratedWithFormsDesigner ).źródło
Można wymienić
StringBuffer
wStringBuilder
(ten ostatni nie jest zsynchronizowane, mogą być szybciej w jednej aplikacji nici)Możesz utworzyć
StringBuilder
instancję raz, zamiast tworzyć ją za każdym razem, gdy jej potrzebujesz.Coś takiego:
I użyj tego w ten sposób:
Jeśli zachowasz swoją
createA
zmienną jako instancję, możesz zaoszczędzić czas podczas tworzenia instancji.Nie jest to bezpieczne dla wątków, jeśli masz wiele wątków, każdy wątek powinien mieć własną kopię.
źródło
Aby uzyskać dobrą wydajność, połącz odpowiedzi od aznilamir i od FrustratedWithFormsDesigner
Dostosuj rozmiar w
BLANKS
zależności od wymagań. Mój konkretnyBLANKS
ciąg ma około 200 znaków.źródło
Miej taką metodę. To dodaje wymagane spacje na końcu danego,
String
aby uzyskać określonąString
długość o określonej długości.źródło
Chcesz, aby ciąg miał stały rozmiar, więc możesz albo dopełnić, albo skrócić, do tabelowania danych ...
Doskonałe odniesienie tutaj .
źródło
Udało mi się to bez użycia zewnętrznych bibliotek w Javie 8
A wynik jest
źródło
int c = 10; Spacje tekstowe = String.format ("%" + c + "c", ''); to rozwiąże twój problem.
źródło
Można również zastosować prostą metodę, jak poniżej
źródło
co powiesz na to?
EDYCJA: Napisałem prosty kod, aby przetestować koncepcję i oto co znalazłem.
Metoda 1: dodanie pojedynczej spacji w pętli:
Metoda 2: dołącz 100 spacji i zapętl, a następnie podciąg:
Wynik otrzymuję tworząc 12 345 678 przestrzeni:
a dla 10 000 000 miejsc:
łączenie bezpośredniej alokacji i iteracji zawsze zajmuje mniej czasu, średnio 60 ms mniej przy tworzeniu dużych przestrzeni. W przypadku mniejszych rozmiarów oba wyniki są pomijalne.
Ale proszę, kontynuujcie komentowanie :-)
źródło
Nie znam żadnej wbudowanej metody na to, o co pytasz. Jednak w przypadku małej stałej długości, takiej jak 10, Twoja metoda powinna być dość szybka.
źródło