Mam zdanie, które jest przekazywane jako ciąg i zastępuję słowo „i” i chcę je zamienić na „”. I nie zastępuje słowa „i” spacjami. Poniżej znajduje się przykład mojej logiki. A kiedy debuguję to, logika wpada w zdanie. Zamień.
String sentence = "Define, Measure, Analyze, Design and Verify"
if (sentence.contains("and")){
sentence.replace("and", " ");
}
Czy jest coś, czego mi tu brakuje.
Odpowiedzi:
Tak, a następnie odrzucasz wartość zwracaną.
Ciągi znaków w Javie są niezmienne - wywołanie
replace
nie zmienia zawartości istniejącego ciągu - zwraca nowy ciąg z modyfikacjami. Więc chcesz:sentence = sentence.replace("and", " ");
Odnosi się to do wszystkich metod w String (
substring
,toLowerCase
etc). Żaden z nich nie zmienia zawartości ciągu.Zwróć uwagę, że tak naprawdę nie musisz tego robić w stanie - w końcu, jeśli zdanie nie zawiera
"and"
, zastąpienie nie zaszkodzi:String sentence = "Define, Measure, Analyze, Design and Verify"; sentence = sentence.replace("and", " ");
źródło
Ciągi znaków są niezmienne , co oznacza, że ich zawartość nie może się zmienić. Kiedy dzwonisz
replace(this,that)
, otrzymujesz całkowicie nowy ciąg. Jeśli chcesz zachować tę nową kopię, musisz przypisać ją do zmiennej. Możesz nadpisać stare odniesienie (a lasentence = sentence.replace(this,that)
lub nowe odniesienie, jak widać poniżej:public class Test{ public static void main(String[] args) { String sentence = "Define, Measure, Analyze, Design and Verify"; String replaced = sentence.replace("and", ""); System.out.println(replaced); } }
Na marginesie, zwróć uwagę, że usunąłem
contains()
czek, ponieważ jest to niepotrzebne wezwanie. Jeśli go nie zawiera, zamiennik po prostu nie dokona żadnej wymiany. Chciałbyś, aby ta metoda zawierała tylko wtedy, gdy wymieniasz inny niż rzeczywisty stan, który sprawdzasz.źródło
contains()
wezwanie powodowało problem - nie było. To był niepotrzebny telefon, ale tak naprawdę nie spowodował żadnych problemów. Problem wynikał z zignorowania zwracanej wartościreplace
, która nie została w ogóle wyjaśniona w odpowiedzi.sentence.replace(" and", ",");
Nie robisz nic ze zwracaną wartością
replace
. Musisz przypisać wynik metody, czyli nowąString
:sentence = sentence.replace("and", " ");
A
String
jest niezmienny w java. Metody takie jakreplace
zwracają nowy plikString
.Twój
contains
test jest niepotrzebny:replace
po prostu nie będzie działać, jeśli nie ma egzemplarzy tekstu do zastąpienia.źródło
Powinieneś ponownie przypisać wynik zamiany, na przykład:
sentence = sentence.replace("and", " ");
Należy pamiętać, że
String
klasa jest niezmienna , co oznacza, że wszystkie jej metody zwracają nowy ciąg i nigdy nie modyfikują oryginalnego ciągu w miejscu, więc wynik wywołania metody w instancjiString
musi być przypisany do zmiennej lub używany natychmiast do zmiany, aby odniosły skutek.źródło
package com.tulu.ds; public class EmailSecurity { public static void main(String[] args) { System.out.println(returnSecuredEmailID("[email protected]")); } private static String returnSecuredEmailID(String email){ String str=email.substring(1, email.lastIndexOf("@")-1); return email.replaceAll(email.substring(1, email.lastIndexOf("@")-1),replacewith(str.length(),"*")); } private static String replacewith(int length,String replace) { String finalStr=""; for(int i=0;i<length;i++){ finalStr+=replace; } return finalStr; } }
źródło