Надеюсь, это можно сделать гораздо проще, но это решение. Мы просто создаем время l oop, которое продолжается, пока есть доступные значения. Затем мы находим значения min и max и затем удаляем их из списка значений. Затем мы создаем новую пару минимальных и максимальных значений. Когда у нас есть все минимальные и максимальные значения, мы сопоставляем их с массивом двойных значений, как вам нужно.
public static void main(String[] args) {
List<Double> values = new ArrayList<>(Arrays.asList(
0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.1, 1.2, 1.3, 1.2,
1.1, 1.0, 0.9, 0.8, 0.7, 0.6, 0.5, 0.4, 0.3, 0.2, 0.1, 0.0, 0.1,
0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.1, 1.0, 0.9, 0.8,
0.7, 0.6, 0.5, 0.4, 0.3, 0.2, 0.1, 0.0
));
List<Pair> pairs = new ArrayList<>();
while (!values.isEmpty()) {
Double min = values.stream().min(Double::compareTo)
.orElseThrow(IllegalStateException::new);
Double max = values.stream().max(Double::compareTo)
.orElseThrow(IllegalStateException::new);
pairs.add(new Pair(min, max));
values.remove(min);
values.remove(max);
}
double[] valuesSorted = pairs.stream()
.map(pair -> new double[] { pair.getMin(), pair.getMax() })
.flatMapToDouble(Arrays::stream)
.toArray();
}
static class Pair {
private final double min;
private final double max;
Pair(double min, double max) {
this.min = min;
this.max = max;
}
public double getMin() {
return min;
}
public double getMax() {
return max;
}
@Override
public String toString() {
return "Pair{" +
"min=" + min +
", max=" + max +
'}';
}
}
Вывод
[0.0, 1.3, 0.0, 1.2, 0.1, 1.2, 0.1, 1.1, 0.1, 1.1, 0.2, 1.1, 0.2, 1.0, 0.2, 1.0, 0.3, 1.0, 0.3, 1.0, 0.3, 0.9, 0.3, 0.9, 0.4, 0.9, 0.4, 0.9, 0.4, 0.8, 0.4, 0.8, 0.5, 0.8, 0.5, 0.8, 0.5, 0.7, 0.5, 0.7, 0.6, 0.7, 0.6, 0.7, 0.6, 0.6]