Re: стыдно....но спрошу
От: cures Россия cures.narod.ru
Дата: 18.03.17 17:28
Оценка:
Здравствуйте, зиг, Вы писали:

зиг>што он делает — проходится по отсортированному списку из чисел (вида -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 — если они тут подойдут


зиг>спасибо
Re[3]: стыдно....но спрошу
От: c-smile Канада http://terrainformatica.com
Дата: 21.03.17 04:26
Оценка:
Здравствуйте, 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. И наоборот.
Re[3]: стыдно....но спрошу
От: Буравчик Россия  
Дата: 26.03.17 15:52
Оценка: 16 (1)
Здравствуйте, Blazkowicz, Вы писали:

B>
B>    private static class Triad<T> {
B>        public Triad(T ... triad) {
B>            this.triad = triad;
B>        }

B>


По сути это Zipper (который из ФП). Класс Triad надо сделать враппером вокруг итератора. И назвать его что-то типа ListIteratorZipper(ListIterator it).
Best regards, Буравчик
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.