1. dlaczego values_[r].length - nie wiem, w tym przypadku użycie columns było by chyba bardziej czytelne :
for (int r=0; r < rows; r++) {
for (int c=0; c < columns; c++) {
.......
}
}
Jeśli tablice 2 wymiarową wyobrazimy sobie jako tabelkę to każda linijka zawiera określoną ilość kolumn
values_[numer linijki].length() = ilość kolumn (UWAGA: numer linijki liczony jest od 0)
2. dlaczego akurat values_.length-1? Bo adresacja tablic liczona jest od 0 a ilość elementów metodą .length() od 1.
values_[0][2] - wskazuje na element z pierwszej linijki i trzeciej kolumny.
Trzeba pamiętać jeszcze, że deklaracja tablic liczona jest od 1:
values_ = new double[10][10] - 10 linijek z 10-cioma kolumnami.