Итерация по 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;
}