Здравствуйте, зиг, Вы писали:
зиг>што он делает — проходится по отсортированному списку из чисел (вида -100, -90, -2, 0, 3, 50) , и для каждого из чисел (кроме центрального — 0) находит "пару" — в зависимости оттого если число отрицательное или положительное — это или следующее число в списке, либо предыдущее. ноля быть не может. зачем такое надо не спрашивайте !!
Формально он и для нулевых элементов что-то делает (при value == 0, refVal == null).
Плюс ещё валится, если самый первый валуй позитивный, совершенно напрасно спрашивая при этом it.hasPrevious(), который всегда вернёт труё, ибо только что взяли же следующий.
Если не надо валиться и не надо ничего делать для текущего нуля, то можно как-то так
Double prevVal = null;
boolean needNext = false;
for (ListIterator<Double> it = list.listIterator(); it.hasNext(); ) {
Double curVal = it.next();
if (needNext)
process(prevVal, curVal);
needNext = curVal < 0;
if (curVal > 0 && prevVal != null)
process(curVal, prevVal);
prevVal = curVal;
}
Правда при этом на одной итерации может понадобиться дважды звать обработку, за себя и за того парня, поэтому лучше её вынести в отдельную функцию. Ещё могут быть какие-то тонкие отличия ввиду того, что зачем-то обрабатываются объекты (ака пойнтеры на них), но сами объекты вроде немодифицируемые, пойнтера мы передадим в функцию, которая их (локальные) испортить не сможет, а порядок обработки должен сохраняться. Зато движение по списку строго одностороннее.
зиг>вопрос — как переписать этот уродский код чтоб было красивее. одобряется использование фич джавы 8 — если они тут подойдут
зиг>спасибо
Здравствуйте, StanislavK, Вы писали:
SK>А где само value-то? сv? Я так понял по условию refValue всегда != value. Оно или null или prev или next.
Как-то так:
Double pv, cv;
for (ListIterator<Double> it = list.listIterator(); it.hasNext(); ) {
pv = cv;
cv = it.next();
Double refValue;
Double value;
if (pv != null && cv != 0) {
if (cv < 0) { refValue = pv; value = cv; }
else if (cv > 0) { refValue = cv; value = pv; }
}
... //какие-то операции с value и refValue
}
TL;DR: смысл в том что есть sliding window из двух элементов. В зависимости от "стороны от нуля" один из этих элементов refValue, а второй value. И наоборот.
Здравствуйте, Blazkowicz, Вы писали:
B>B> private static class Triad<T> {
B> public Triad(T ... triad) {
B> this.triad = triad;
B> }
B>
По сути это Zipper (который из ФП). Класс Triad надо сделать враппером вокруг итератора. И назвать его что-то типа ListIteratorZipper(ListIterator it).