Итерация по SortedSet в Java

Я пытаюсь создать интервалы для двойных значений, хранящихся в SortedSet.

Ниже мой код:

 public class Trail {
    public static void main(String[] args) {
        SortedSet<Double> val = new TreeSet<Double>();
        val.add(1.0);
        val.add(2.0);
        val.add(11.0);
        val.add(12.0);

        ArrayList<String> arr = new ArrayList<String>();
        double posinf = Double.POSITIVE_INFINITY;
        double neginf = Double.NEGATIVE_INFINITY;
        arr.add(neginf+ " - " +val.first());
        Iterator<Double> it = val.iterator();
        while (it.hasNext()) {
            // Get element
            Object lowerBound = it.next();
            Object upperBound = it.next();
            arr.add(lowerBound+" - "+upperBound);
        }
        arr.add(val.last() + " - "+ posinf);
        System.out.println("Range array: "+arr);
    }
 }

Мой текущий вывод:

Range array: [-Infinity - 1.0, 1.0 - 2.0, 11.0 - 12.0, 12.0 - Infinity]

Я ожидаю массив массивов как:

[-Infinity - 1.0, 1.0 - 2.0, 2.0 - 11.0, 11.0 - 12.0, 12.0 - Infinity]

3 ответа

Решение

Вы потребляете два элемента в каждой итерации вашего цикла (что вызвало бы исключение, если бы количество элементов было нечетным). Вы должны использовать только один в каждой итерации:

    Iterator<Double> it = val.iterator();
    Double lowerBound = neginf;
    while (it.hasNext()) {
        // Get element
        Double upperBound = it.next();
        arr.add(lowerBound+" - "+upperBound);
        lowerBound = upperBound;
    }
    arr.add(lowerBound  + " - "+ posinf);

Каждый вызов it.next() будет пересылать итератор за один шаг. Поэтому в каждой итерации цикла while вы потеряете один интервал. Используйте временную переменную, чтобы сохранить предыдущее значение итератора.

Для чего-то вроде

Iterator<Double> it = val.iterator();
Object end=null;
if(it.hasNext()){
    end= it.next();
    //write out -infinity to previous.
}
while(it.hasNext()){
    Object start = end;
    end= it.next();
    //write out start - end interval
}
if(end != null){
// write out end to infinity 
} else {
   // there were no values in the array.
   // write out - infinity to infinity?
}

Проблема в следующем цикле

while (it.hasNext()) {
    // Get element
    Object lowerBound = it.next();
    Object upperBound = it.next();
    arr.add(lowerBound+" - "+upperBound);
}

итератор it увеличивается в два раза it.next() в одной итерации, которая в конечном итоге приводит к массиву, который вы получаете.

Решение как ниже:

Double lowerBound = neginf;
while (it.hasNext()) {
    // Get element
    Double upperBound = it.next();
    arr.add(lowerBound + " - "+ upperBound);
    lowerBound = upperBound;
}
Другие вопросы по тегам