temp_next_first = n+1[0]; // It's wrong, but something like this
temp_next_first = n.next()[0] // or this way ??
那些2不工作,因爲n
是一個簡單的i32
,這意味着它不知道它是v
一部分。
如果你只需要向前看一個迭代(下一個項目),你可以使用一個peekable iterator,而是因爲你有在整個VEC進行掃描,這是不是你所需要的是什麼。
據我理解你的問題,你想擁有一種鏈的其中一個一體成型的結束是一樣的未來的開始。
[4,3][3,7][7,5][5,9] // something like this.
我認爲實際上以相當快的方式做到這一點確實很複雜。 你可以這樣做的一種方式如下。
fn order<T: PartialEq>(vec: &mut Vec<(T,T)>) {
if vec.len() == 0 {
return;
}
let mut temp = vec![vec.remove(0)];
'outer: loop {
let mut next: Option<usize> = None;
'inner: for (i, item) in vec.iter().enumerate() {
if item.0 == temp.last().unwrap().1 {
next = Some(i);
break 'inner;
}
}
match next {
Some(pos) => temp.push(vec.remove(pos)),
None => break 'outer,
}
}
*vec = temp;
}
現在你可以調用這個函數是這樣的:
fn main() {
let mut v: Vec<(i32,i32)> = vec![(4,5),(2,8),(5,7)];
order(&mut v);
println!("{:?}",v);
}
這應該打印:[(4, 5), (5, 7)]
讓我們來看看order
功能很多更多詳細信息:
if vec.is_empty() {
return;
}
首先我們看看vec
是否爲空,在這種情況下我們只是退出函數。
let mut temp = vec![vec.remove(0)];
我們創建了一個新的Vec<i32,i32>
其中包含了舊VEC,我們刪除的第一要素。
'outer: loop {
let mut next: Option<usize> = None;
/* snip */
match next {
Some(pos) => temp.push(vec.remove(pos)),
None => break 'outer,
}
}
*vec = temp;
現在,我們創建了一個名爲next
的Option<usize>
,如果這是在'outer
循環結束零,存在的vec
內沒有安裝件意味着我們結束這種功能,並設置我們得到了作爲輸入Vec
temp
。
如果next
是Some(value)
,這意味着我們發現的嵌合雙vec
我們再撈出push
內部分成temp
。在此之後,我們只需重複從頭開始循環。
'inner: for (i, item) in vec.iter().enumerate() {
if item.0 == temp.last().unwrap().1 {
next = Some(i);
break 'inner;
}
}
在這裏,我們通過iterate
和vec
比較item.0
最後element
或temp
,如果這兩個是我們必須以某種方式消除這種element
從vec
,放入temp
相同。可悲的是,我們不能在for
之內變異vec
,因爲for
-loop參考vec
,這意味着我們不能在其內部更改vec
。
爲了規避這個問題,我們只需在我們的vec.iter()
上撥打enumerate()
,這告訴我們我們要刪除的item
的位置。現在,當if item.0 == temp.last().unwrap().1
是true
時,我們將next
設置爲Some(i)
(i
是item
的位置)並退出'inner
循環。
這應該解釋功能比它可能應該更詳細,希望它以某種方式幫助。
謝謝@ljedrz我不知道這個簡單的函數以這種方式排序。但是當我想在當前迭代中檢查下一次迭代的值時呢? – twistezo
@twistezo'sort()'使用'Ord'特徵對一個切片的元素進行排序。 'Ord'也用於數組,並將比較詞典。 –