Mam np. nazwisko Kowalski i chcę wypisać taki kod:
(surname.substring(surname.length() - 3,surname.length() - 1).equals("ski"))
Aby sprawdzić czy pokaże true.
I pokazuje false nie wiem czemu, przecież nazwisko Kowalski ma końcówkę "ski".
Mam np. nazwisko Kowalski i chcę wypisać taki kod:
(surname.substring(surname.length() - 3,surname.length() - 1).equals("ski"))
Aby sprawdzić czy pokaże true.
I pokazuje false nie wiem czemu, przecież nazwisko Kowalski ma końcówkę "ski".
Wypisz sobie zmienne, albo najlepiej odpal i sprawdź w debuggerze to się dowiesz.
Wymaż ten kod i zastąp go tym
surname.endsWith("ski");
@bogdans podał działające rozwiązanie, ale dla wyjaśnienia Twojej wątpliwości: niepotrzebnie cofasz indeks końcowy (surname.length() - 1), który jest już pomniejszony o jeden w samej metodzie. W rzeczywistości masz porównanie:
"sk".equals("ski")
co oczywiście zwraca false.
W przypadku porównywania ostatnich znaków, można zapisać to w jeden z poniższych sposobów:
if (surname.substring(surname.length() - 3).equals("ski"))
if (surname.substring(surname.length() - 3, surname.length()).equals("ski"))
działa, ale litery w stringu są indeksowane od 0, to ostatnia litera powinna mieć indeks length() - 1, to czemu tak nie jest ? W C++ jest tak właśnie.
w c++ były indeksy normalnie jak w tablicach, nie ma tam -1 ?
Po kolei:
Cyt. z dokumentacji:
"The substring begins at the specified beginIndex and extends to the character at index endIndex - 1. "
Parameters:
beginIndex - the beginning index, inclusive.
endIndex - the ending index, exclusive.
K | O | W | A | L | S | K | I
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7
"Kowalski".length()-3 daje nam 5. 5-Ty znak to S, ponieważ beginIndex jest inclusive od niego zaczynamy liczyć.
"Kowalski".length() daje nam 8. endIndex jest exclusive co znaczy, że nie jest zawarty, czyli mamy jakby zbiór znaków <5,8).
Jasne, że jest w tablicach -1. Gdybyś sam pisał metodę substring prawdopodobnie byś musiał użyć czegoś podobnego lub ograniczyć odpowiednio algorytm.
Mogłoby to wyglądać tak:
char[] substring= surname.toCharArray();
StringBuilder sb = new StringBuilder();
int beginIndex = 5;
int endIndex = surname.length()-1;
for (int i=beginIndex; i<=endIndex; i++){ // lub i < surname.length()
sb.append(substring[i]);
}
System.out.println(sb.toString());