Substring - dlaczego pokazuje false?

0

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".

0

Wypisz sobie zmienne, albo najlepiej odpal i sprawdź w debuggerze to się dowiesz.

4

Wymaż ten kod i zastąp go tym

surname.endsWith("ski");
1

@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"))
0

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.

0

w c++ były indeksy normalnie jak w tablicach, nie ma tam -1 ?

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).

0

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());

1 użytkowników online, w tym zalogowanych: 0, gości: 1