我在 kotlin 中有以下代碼,我試圖找到一個 Rust 等價物,但不了解 Rust 中要轉換的鏈接機制。
val windowSize = 2
val result = listOf(1, 2, 3, 4, 5, 6)
.windowed(windowSize, 1) ; [[1,2], [2,3], [3,4], [4,5], [5,6]]
.map { it.sum() } ; [ 3, 5, 7, 9, 11]
.windowed(2, 1) ; [[3,5], [5,7], [7,9], [9,11] ]
.count { it[0] < it[1] } ; 4
;; result = 4, as there are 4 sequences that have first number less than 2nd,
;; when considering a sliding window over the original data of 2 items at a time.
它只需要一個整數串列,將它們分成對(但 windowSize 將是一個函式引數),對這些組求和,再次將總和分成對,并找到每個第二個元素比前一個元素大的地方,因此找到遞增的值在移動視窗上。
我正在將其轉換為 Rust 等價物,但很難理解如何將操作鏈接在一起。
到目前為止我所得到的是:
let input = [1, 2, 3, 4, 5, 6];
input.windows(2)
.map(|es| es.iter().sum())
// what goes here to do the next windows(2) operation?
.for_each(|x: u32| println!("{}", x));
我可以在地圖上“for_each”以在迭代中做一些事情,但我不能將它與另一個“windows()”分開,或者不知道使這成為可能的魔法。IntelliJ 向我展示了 map 的回傳型別是impl Iterator<Item=?>
任何人都可以請教我嗎?我絕對是 Rust 的初學者,所以這無疑與我對整個語言的理解有關。
uj5u.com熱心網友回復:
該Itertools箱提供了一種較為方便的方式與做到這一點tuple_windows的方法。
use itertools::Itertools;
fn main() {
let input = [1i32, 2, 3, 4, 5, 6];
let output: usize = input
.windows(2)
.map(|es| es.iter().sum::<i32>())
.tuple_windows()
.filter(|(a, b)| a < b)
.count();
println!("{}", output);
}
操場
標準庫沒有辦法在不首先收集迭代器的情況下做到這一點,這需要兩次遍歷資料。
uj5u.com熱心網友回復:
將所有內容鏈接起來有點令人費解。您需要收集到一個 vec 中,以便您可以windows再次訪問。然后,您可以將視窗 flat_map 到陣列參考(取自其他答案)以完成您想要執行的操作:
fn main() {
let input = [1usize, 2, 3, 4, 5, 6];
let res = input
.windows(2)
.map(|es| es.iter().sum::<usize>())
.collect::<Vec<_>>()
.windows(2)
.flat_map(<[usize; 2]>::try_from)
.filter(|[a, b]| a < b)
.count();
println!("{}", res);
}
操場
注意:array_windows使用 const generic 的Nightly 功能允許洗掉.flat_map(<&[usize; 2]>::try_from)呼叫
uj5u.com熱心網友回復:
正如@Aiden4 的回答中所述,最好的解決方案是使用itertools::tuple_windows. 但是,可以僅使用標準庫而不使用Iterator::scan以下方法收集到中間向量:
fn main() {
let input = [1i32, 2, 3, 4, 5, 6];
let output: usize = input
.windows(2)
.map(|es| es.iter().sum())
.scan(0, |prev, cur| {
let res = (*prev, cur);
*prev = cur;
Some(res)
})
.skip(1)
.filter(|(a, b)| a < b)
.count();
println!("{}", output);
}
操場
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/371513.html
