Итак, я читаю на Java, и я натолкнулся на пример. Я понятия не имею, как это работает. Ниже вы увидите метод sortByTime()
в классе ConsLoRunner
. Мой вопрос в том, как он может что-то выводить, не будет ли он снова и снова повторять этот метод и никогда не достигнет метода insertByTime(this.first)
?Невозможно понять метод вызова Java по методу
Боковое примечание: пример Бегунов для марафона и их сортировка в зависимости от их времени (от самого быстрого до самого медленного).
class Runner {
String name;
int age;
int bib;
boolean isMale;
int pos;
int time;
Runner(String name, int age, int bib, boolean isMale, int pos, int time) {
this.name = name;
this.age = age;
this.bib = bib;
this.isMale = isMale;
this.pos = pos;
this.time = time;
}
public boolean finishesBefore(Runner r) {
return this.time < r.time;
}
}
interface ILoRunner {
ILoRunner sortByTime();
ILoRunner insertByTime(Runner r);
}
class MtLoRunner implements ILoRunner {
public ILoRunner sortByTime() {
return this;
}
public ILoRunner insertByTime(Runner r) {
return new ConsLoRunner(r, this);
}
}
class ConsLoRunner implements ILoRunner {
Runner first;
ILoRunner rest;
ConsLoRunner(Runner first, ILoRunner rest) {
this.first = first;
this.rest = rest;
}
/*******HOW DOES IT DO THIS?????**********/
public ILoRunner sortByTime() {
return this.rest.sortByTime().insertByTime(this.first);
}
public ILoRunner insertByTime(Runner r) {
if (this.first.finishesBefore(r)) {
return new ConsLoRunner(this.first, this.rest.insertByTime(r));
}
else {
return new ConsLoRunner(r, this);
}
}
}
class ExamplesRunners {
MtLoRunner empty = new MtLoRunner();
Runner tim = new Runner ("Tim", 1, 2, true, 5, 6);
Runner bob = new Runner ("Bob", 5, 6, true, 9, 50);
Runner jim = new Runner ("Jim", 5, 6, true, 10, 40);
ILoRunner list1 = new ConsLoRunner(this.tim, new ConsLoRunner(this.bob, new ConsLoRunner(this.jim, this.empty)));
boolean testSort(Tester t) {
return t.checkExpect(this.list1.sortByTime(), new ConsLoRunner(this.tim, new ConsLoRunner(this.jim, new ConsLoRunner(this.bob, this.empty))));
}
}
Это было потрясающе, спасибо вам большое. Одна часть, о которой я до сих пор смущаюсь, - это то, как Java знает «1. Сортировка остальной части списка. Все, что вы делаете, это вызов метода в остальной части списка? Как это волшебно просто сортировать? – CtrlAltDelete
А это красота рекурсии, не так ли? Сначала вы определяете базовый регистр для пустого списка. Затем в каждой рекурсии вы даете методу меньшую проблему и считаете, что решение, которое оно возвращает вам, является правильным, а затем действовать по решению, чтобы получить более крупное решение. Я постараюсь объяснить это лучше. :) –