В моем учебнике есть пример того, как сортировать строковые массивы, но мне трудно понять логику кода. У нас есть следующий массив:
String[] words = {"so", "in", "very", "every", "do"};
Сам метод выглядит следующим образом:
public static void sortArray(Comparable[] compTab) {
for (int next=1; next < compTab.length; next++) {
Comparable value = compTab[next];
int this;
for (this = next; this > 0 && value.compareTo(compTab[this-1]) < 0; this--) {
compTab[this] = compTab[this-1];
}
compTab[this] = value;
writeArray(next + " run through: ", compTab);
}
}
Этот последний вызов writeArray
приводит к тому, что следующий текст будет напечатан для первого прохода: "1. выполнить: так очень каждый делает"
OK. Как я уже сказал, у меня есть некоторые проблемы с логикой в этом коде. Если мы пройдем цикл в первый раз, то вот что я вижу:
Имеем: Comparable value = compTab[1]
. Это означает, что значение = "в".
Мы начинаем внутренний цикл с this = next
(что == 1). Таким образом, Java будет проходить внутренний цикл только один раз. Оказывается, что для первого запуска value.compareTo(compTab[this-1])
действительно меньше 0. Таким образом, мы имеем: compTab[1] = compTab[0]
. Это означает, что слово, которое раньше было в позиции [1], теперь заменяется словом, которое раньше было в позиции [0]. Таким образом, теперь у нас есть слово «так» в позиции [1] массива.
Следующий шаг в методе: compTab[this] = value
. Это где я запутался. Это говорит мне о том, что, поскольку это = 1, мы здесь получаем compTab[1] = value
. Однако ранее в методе мы определили значение = «в». Это говорит мне, что позиция [1] в массиве снова принимает слово «in».
Как я вижу, окончательная распечатка должна быть:
«1. Пробежать: так в любом деле».
Другими словами, как я следую логике кода, окончательная распечатка массива будет такой же, какой была до внедрения метода! Ясно, что здесь есть некоторая часть моей логики, которая не верна. Например - я не вижу, как слово, которое раньше было в позиции [1], теперь находится в позиции [0]. Если кто-нибудь может помочь мне объяснить это, я был бы очень признателен!