Dla słabych: twoje zachowanie jest protekcjonalne. To pytanie jest szczegółowe i konkretne, napisane jasno i prosto, interesujące dla przynajmniej jednego innego programisty gdzieś. Ludzie mogą nie wiedzieć, gdzie szukać javadoc lub kodu źródłowego. Naszym zadaniem jest pomóc im, a nie walić ich za ignorancję.
glmxndr
14
@subtenante, masz rację. Broniłem nawet wcześniej ludzi przed zadawaniem google'owych pytań. Jednak coś tak prostego, jak to, powinno zostać przetestowane samodzielnie, a IMO NIGDY nie powinno uzasadniać umieszczania pytania na stronie z pytaniami i odpowiedziami. Tytuł wprowadza w błąd, a Q to strata czasu dla wszystkich, którzy go czytają.
Chris
9
@Chris: oneat dało mi okazję spojrzeć na kod źródłowy. Wiele się nauczyłem o trim (). Nie zrobiłbym inaczej. Każdy jest odpowiedzialny za własne spędzanie czasu. Nie można winić go za to, że nie możemy odnieść korzyści z jego pozornie naiwnego pytania.
glmxndr
1
@skaffman: (c) powinno być „spróbuj i zobacz”, a dopiero potem (d) zapytaj na SO.
Mac,
2
To pytanie wydaje się być nie na temat, ponieważ dotyczy czegoś, co każdy powinien znaleźć w instrukcji ORAZ przetestować w mniej niż minutę.
Musiałem głosować przeciw, ponieważ ta odpowiedź nie wyjaśnia, co w dokumentacji oznacza „białe spacje”. Wydawałoby się logiczne, że byłoby Chararacter.isWhitespaceto prawdą, ale nie o to chodzi przez „
białą
7
@ user2864740: Ta odpowiedź nie jest przeznaczony do kompleksowej analizy trim, isWhiteSpaceitp, lub omówienie niejasności w docs Java; jest to prosta odpowiedź na konkretne pytanie zadane powyżej - tj. czy trimmetoda usuwa pojedynczą spację czy wiele spacji?
LukeH
Wiem, że tak nie jest. Głosowałem w dół, ponieważ nie wskazuje na to, nawet mimochodem. W każdym razie nie mogę cofnąć swojego głosu, chyba że zostanie zaktualizowany (choć minimalnie).
user2864740
33
Z kodu źródłowego (zdekompilowany):
publicString trim(){int i =this.count;int j =0;int k =this.offset;char[] arrayOfChar =this.value;while((j < i)&&(arrayOfChar[(k + j)]<=' '))++j;while((j < i)&&(arrayOfChar[(k + i -1)]<=' '))--i;return(((j >0)||(i <this.count))? substring(j, i):this);}
Te dwa while, które widzisz, oznaczają, że wszystkie znaki, których Unicode znajduje się poniżej znaku spacji, na początku i na końcu, zostaną usunięte.
Poproś nowego programistę, który właśnie nauczył się, jak wykonać System.out.println, o wykonanie testu jednostkowego, aby zobaczyć, jaki jest wynik ...
jaxkodex
26
Jedną rzeczą, na którą należy zwrócić uwagę, jest to, że String.trim ma osobliwą definicję „białych znaków”. Nie usuwa białych znaków Unicode, ale usuwa również znaki sterujące ASCII, których nie można uważać za białe znaki.
Ta metoda może być używana do przycinania białych znaków z początku i końca łańcucha; w rzeczywistości przycina również wszystkie znaki sterujące ASCII.
Jeśli to możliwe, możesz chcieć użyć metody StringUtils.strip () firmy Commons Lang, która również obsługuje białe znaki Unicode (i jest również bezpieczna dla wartości null).
Wygląda na to, że ze strony konstruktorów było to straszne przeoczenie ... a strasznie zbyt techniczna praca dokumentacji niewiele pomaga.
user2864740
2
Brawo! Przyjąłeś najprostsze pytanie, jakie kiedykolwiek zadano w StackOverflow i znalazłeś coś inteligentnego do powiedzenia na jego temat. Jesteś zasługą wyścigu.
Mark McKenna
3
@MarkMcKenna: Ciągle odkrywam, że te rzekomo bardzo proste pytania programistyczne (przycinanie ciągów znaków, znajdowanie rozszerzeń nazw plików itp.) Zawsze mają swoją ukrytą złożoność. To trochę rozczarowuje nasze rzemiosło i narzędzia.
Zwraca kopię ciągu z pominięciem wiodących i końcowych białych znaków.
Usunięto odstępy po obu stronach:
Zauważ, że trim()nie zmienia instancji String, zwróci nowy obiekt:
String original =" content ";String withoutWhitespace = original.trim();// original still refers to " content "// and withoutWhitespace refers to "content"
faktycznie nic nie może zmienić instancję String (z wyjątkiem niektórych brudnych rzeczy, które mogą ulec awarii VM)
AvrDragon
13
W oparciu o dokumentację Java , która znajduje się tutaj , .trim()zastępuje znak „\ u0020”, który jest powszechnie znany jako biały znak.
Ale zwróć uwagę, że '\ u00A0' ( SPACJA BEZ PRZERW w Unicode ) jest również postrzegana jako biała spacja i.trim() NIE spowoduje jej usunięcia. Jest to szczególnie powszechne w HTML.
W oparciu o Javadoc usuwa początkowe i końcowe białe znaki, które obejmują spację, tabulator, powrót karetki nowej linii, wysuw formularza, ... i który wyklucza znaki, które nie są początkowe ani końcowe.
Markiz Lorne
Dzięki, pomaga mi przydzielić
Asad Haider
8
Przykład trim()usuwania spacji w Javie :
publicclassTest{publicstaticvoid main(String[] args){String str ="\n\t This is be trimmed.\n\n";String newStr = str.trim();//removes newlines, tabs and spaces.System.out.println("old = "+ str);System.out.println("new = "+ newStr);}}
/**
* Returns a copy of the string, with leading and trailing whitespace
* omitted.
* <p>
* If this <code>String</code> object represents an empty character
* sequence, or the first and last characters of character sequence
* represented by this <code>String</code> object both have codes
* greater than <code>'\u0020'</code> (the space character), then a
* reference to this <code>String</code> object is returned.
* <p>
* Otherwise, if there is no character with a code greater than
* <code>'\u0020'</code> in the string, then a new
* <code>String</code> object representing an empty string is created
* and returned.
* <p>
* Otherwise, let <i>k</i> be the index of the first character in the
* string whose code is greater than <code>'\u0020'</code>, and let
* <i>m</i> be the index of the last character in the string whose code
* is greater than <code>'\u0020'</code>. A new <code>String</code>
* object is created, representing the substring of this string that
* begins with the character at index <i>k</i> and ends with the
* character at index <i>m</i>-that is, the result of
* <code>this.substring(<i>k</i>, <i>m</i>+1)</code>.
* <p>
* This method may be used to trim whitespace (as defined above) from
* the beginning and end of a string.
*
* @return A copy of this string with leading and trailing white
* space removed, or this string if it has no leading or
* trailing white space.
*/publicString trim(){int len = count;int st =0;int off = offset;/* avoid getfield opcode */char[] val = value;/* avoid getfield opcode */while((st < len)&&(val[off + st]<=' ')){
st++;}while((st < len)&&(val[off + len -1]<=' ')){
len--;}return((st >0)||(len < count))? substring(st, len):this;}
Zauważ, że po pobraniu start i length wywołuje metodę podciągową klasy String.
Tak, wynik będzie brzmiał „abc”; Ale jeśli dane wejściowe typu String to:
String b =" This is a test "System.out.println(b);
Wynik będzie This is a test
taki, że przycinanie usuwa tylko spacje przed pierwszym znakiem i po ostatnim znaku w ciągu i ignoruje spacje wewnętrzne. To jest fragment mojego kodu, który nieznacznie optymalizuje wbudowaną Stringmetodę trim, usuwając spacje wewnętrzne i usuwając spacje przed i po pierwszym i ostatnim znaku w ciągu. Mam nadzieję, że to pomoże.
Jedną bardzo ważną rzeczą jest to, że ciąg złożony w całości z „białych spacji” zwróci pusty ciąg.
if a string sSomething = "xxxxx", gdzie xoznacza białe spacje, sSomething.trim()zwróci pusty ciąg.
jeśli a string sSomething = "xxAxx", gdzie xoznacza białe spacje, sSomething.trim()zwróci A.
jeśli sSomething ="xxSomethingxxxxAndSomethingxElsexxx", sSomething.trim()wróci SomethingxxxxAndSomethingxElsezauważyć, że liczba xmiędzy słowami jest nie zmieniona.
Jeśli chcesz sprawdzić, jak zadziała jakaś metoda, możesz skorzystać z BeanShell . Jest to język skryptowy zaprojektowany tak, aby był jak najbliżej Javy. Mówiąc ogólnie, jest to interpretowane jako Java z pewnymi udogodnieniami. Inną opcją tego rodzaju jest język Groovy . Oba te języki skryptowe zapewniają wygodną pętlę Read-Eval-Print znaną z języków interpretowanych. Możesz więc uruchomić konsolę i po prostu wpisać:
" content ".trim();
"content"Rezultat zobaczysz po naciśnięciu Enter(lub Ctrl+Rw konsoli Groovy).
@Mark, ale przypadkowo tego szukałem, kiedy otworzyłem to pytanie ...
Armfoot
To też nie ma sensu. trim()już robi to, co repkaceAll()by zrobił, gdyby zostało mu coś do zrobienia.
Markiz Lorne
@EJP funkcja replaceAll zamieniłaby również białe znaki w łańcuchu na pojedynczą spację, podczas gdy przycinanie obsługiwałoby tylko spacje początkowe i końcowe
Odpowiedzi:
Wszystkie z nich .
(Ale dlaczego po prostu tego nie spróbowałeś i sam się nie przekonałeś?)
źródło
Chararacter.isWhitespace
to prawdą, ale nie o to chodzi przez „trim
,isWhiteSpace
itp, lub omówienie niejasności w docs Java; jest to prosta odpowiedź na konkretne pytanie zadane powyżej - tj. czytrim
metoda usuwa pojedynczą spację czy wiele spacji?Z kodu źródłowego (zdekompilowany):
Te dwa
while
, które widzisz, oznaczają, że wszystkie znaki, których Unicode znajduje się poniżej znaku spacji, na początku i na końcu, zostaną usunięte.źródło
W razie wątpliwości napisz test jednostkowy:
Uwaga : oczywiście test (dla JUnit + Hamcrest) nie kończy się niepowodzeniem
źródło
Jedną rzeczą, na którą należy zwrócić uwagę, jest to, że String.trim ma osobliwą definicję „białych znaków”. Nie usuwa białych znaków Unicode, ale usuwa również znaki sterujące ASCII, których nie można uważać za białe znaki.
Jeśli to możliwe, możesz chcieć użyć metody StringUtils.strip () firmy Commons Lang, która również obsługuje białe znaki Unicode (i jest również bezpieczna dla wartości null).
źródło
Zobacz API dla klasy String:
Usunięto odstępy po obu stronach:
Zauważ, że
trim()
nie zmienia instancji String, zwróci nowy obiekt:źródło
W oparciu o dokumentację Java , która znajduje się tutaj ,
.trim()
zastępuje znak „\ u0020”, który jest powszechnie znany jako biały znak.Ale zwróć uwagę, że '\ u00A0' ( SPACJA BEZ PRZERW w Unicode
) jest również postrzegana jako biała spacja i.trim()
NIE spowoduje jej usunięcia. Jest to szczególnie powszechne w HTML.Aby go usunąć, używam:
Przykład tego problemu został omówiony tutaj .
źródło
Przykład
trim()
usuwania spacji w Javie :WYNIK
źródło
Z dokumentacji java (źródło klasy String),
Zauważ, że po pobraniu start i length wywołuje metodę podciągową klasy String.
źródło
trim()
usunie wszystkie początkowe i końcowe spacje. Ale pamiętaj: Twój ciąg nie jest zmieniany.trim()
zwróci zamiast tego nową instancję ciągu.źródło
Jeśli dane wejściowe typu String to:
Tak, wynik będzie brzmiał „abc”; Ale jeśli dane wejściowe typu String to:
Wynik będzie
This is a test
taki, że przycinanie usuwa tylko spacje przed pierwszym znakiem i po ostatnim znaku w ciągu i ignoruje spacje wewnętrzne. To jest fragment mojego kodu, który nieznacznie optymalizuje wbudowanąString
metodę trim, usuwając spacje wewnętrzne i usuwając spacje przed i po pierwszym i ostatnim znaku w ciągu. Mam nadzieję, że to pomoże.źródło
.trim()
wSystem.out.println(a);
?Usunie wszystkie przestrzenie po obu stronach.
źródło
Jedną bardzo ważną rzeczą jest to, że ciąg złożony w całości z „białych spacji” zwróci pusty ciąg.
if a
string sSomething = "xxxxx"
, gdziex
oznacza białe spacje,sSomething.trim()
zwróci pusty ciąg.jeśli a
string sSomething = "xxAxx"
, gdziex
oznacza białe spacje,sSomething.trim()
zwróciA
.jeśli
sSomething ="xxSomethingxxxxAndSomethingxElsexxx"
,sSomething.trim()
wróciSomethingxxxxAndSomethingxElse
zauważyć, że liczbax
między słowami jest nie zmieniona.Jeśli chcesz, aby zgrabny łańcuch w pakietach został połączony
trim()
z wyrażeniem regularnym, jak pokazano w tym poście: Jak usunąć zduplikowane białe znaki w ciągu za pomocą Javy? .Porządek nie ma znaczenia dla wyniku, ale
trim()
najpierw byłby bardziej wydajny. Mam nadzieję, że to pomoże.źródło
Aby zachować tylko jedną instancję dla ciągu, możesz użyć następującego.
lub
Wtedy wartość
str
String będziestr = "Hello"
źródło
Trim () działa dla obu stron.
źródło
Javadoc for String zawiera wszystkie szczegóły. Usuwa spacje (spacje, tabulatory itp.) Z obu końców i zwraca nowy ciąg.
źródło
Jeśli chcesz sprawdzić, jak zadziała jakaś metoda, możesz skorzystać z BeanShell . Jest to język skryptowy zaprojektowany tak, aby był jak najbliżej Javy. Mówiąc ogólnie, jest to interpretowane jako Java z pewnymi udogodnieniami. Inną opcją tego rodzaju jest język Groovy . Oba te języki skryptowe zapewniają wygodną pętlę Read-Eval-Print znaną z języków interpretowanych. Możesz więc uruchomić konsolę i po prostu wpisać:
"content"
Rezultat zobaczysz po naciśnięciuEnter
(lubCtrl+R
w konsoli Groovy).źródło
źródło
trim()
już robi to, corepkaceAll()
by zrobił, gdyby zostało mu coś do zrobienia.