2017-08-17 50 views
0

我有一個向量:如何在Rust for loop的當前迭代中獲得下一次迭代的值?

let mut v: Vec<Vec<i32>> = Vec::new(); 
// [[1, 2, 3], [7, 8, 9], [3, 4, 5], [12, 13, 14], [5, 6, 7]]` 

我想它排序到:

// [[1, 2, 3], [3, 4, 5], [5, 6, 7], [7, 8, 9], [12, 13, 14]] 

我得到各個最後一個元素的「延續」重組載體這個載體。重要的是我不能改變向量中元素的位置。我可以改變整個向量的位置。

如何在當前迭代中獲得下一次迭代的值?

for n in v { 
    temp_current_first = n[0]; // OK 
    temp_current_last = n[n.len()-1]; // OK 
    temp_next_first = n+1[0]; // It's wrong, but something like this 
    temp_next_first = n.next()[0] // or this way ?? 
} 

回答

1
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; 

現在,我們創建了一個名爲nextOption<usize>,如果這是在'outer循環結束零,存在的vec內沒有安裝件意味着我們結束這種功能,並設置我們得到了作爲輸入Vectemp

如果nextSome(value),這意味着我們發現的嵌合雙vec我們再撈出push內部分成temp。在此之後,我們只需重複從頭開始循環。

'inner: for (i, item) in vec.iter().enumerate() { 
    if item.0 == temp.last().unwrap().1 { 
     next = Some(i); 
     break 'inner; 
    } 
} 

在這裏,我們通過iteratevec比較item.0最後elementtemp,如果這兩個是我們必須以某種方式消除這種elementvec,放入temp相同。可悲的是,我們不能在for之內變異vec,因爲for -loop參考vec,這意味着我們不能在其內部更改vec

爲了規避這個問題,我們只需在我們的vec.iter()上撥打enumerate(),這告訴我們我們要刪除的item的位置。現在,當if item.0 == temp.last().unwrap().1true時,我們將next設置爲Some(i)iitem的位置)並退出'inner循環。

這應該解釋功能比它可能應該更詳細,希望它以某種方式幫助。

3

好,最簡單的辦法是隻做到:

v.sort(); 

這隻會排序外載體。否則,如果你想自己實施它,我會建議看看不同的sorting algorithms,因爲有很多可能的方式來做到這一點。

+0

謝謝@ljedrz我不知道這個簡單的函數以這種方式排序。但是當我想在當前迭代中檢查下一次迭代的值時呢? – twistezo

+1

@twistezo'sort()'使用'Ord'特徵對一個切片的元素進行排序。 'Ord'也用於數組,並將比較詞典。 –

相關問題