Используйте итераторы!
На слайсах можно использовать метод windows()
для получения последовательных пар элементов.В вашем случае vector.windows(2)
даст: [1.025, 1.028]
, [1.028, 1.03]
, [1.03, 1.05]
и, наконец, [1.05, 1.051]
.
Это итератор, поэтому вы можете применить к нему преобразование.В вашем случае я бы предложил map
, чтобы сопоставить каждую пару с разницей между двумя элементами пары: .map(|slice| slice[0] - slice[1])
.И, возможно, возьмите абсолютную разницу, используя (slice[0] - slice[1]).abs()
.
Это все еще итератор, так что, наконец, вы можете применить min_by
, который даст только минимум всех элементов.Плавает только орудие PartialOrd
1 , поэтому: .min_by(|x, y| x.partial_cmp(y).unwrap())
.
В общей сложности на детской площадке :
fn main() {
let vector = vec![1.025_f64, 1.028, 1.03, 1.05, 1.051];
let minimum =
vector.windows(2)
.map(|slice| (slice[0] - slice[1]).abs())
.min_by(|x, y| x.partial_cmp(y).unwrap());
println!("{:?}", minimum);
}
1 Как видно, поплавки МОГУТ сравниваться.Однако из-за присутствия NaN результат составляет Option<Ordering>
.В этом случае, предполагая, что во входных данных нет NaN, я просто использовал unwrap
, чтобы добраться до основного порядка;если проникнет NaN, он запаникует.