Получение индекса элемента в функции раздела - PullRequest
1 голос
/ 25 марта 2019

Мне нужно разбить массив / вектор на ржавчину и найти раздел в документе. Похоже, что функция обратного вызова, переданная в partition, имеет доступ только к элементам массива. Как мне получить индекс предмета?

Например, давая массив [1, 2, 3, 4], как мне разбить его на два на основе их позиции, чтобы первый был [1, 3], потому что каждый из них имеет четную позицию (1 и 3 имеют индексы 0 и 2 который является четным числом), а второй будет [2, 4].

Ответы [ 2 ]

4 голосов
/ 25 марта 2019

Решением может быть использование enumerate и partition_map от itertools:

use itertools::{Either, Itertools};

fn main() {
    let a = vec![1, 2, 3, 4];

    let (b, c): (Vec<_>, Vec<_>) = a.into_iter().enumerate().partition_map(|(i, foo)| {
        if i % 2 == 0 {
            Either::Left(foo)
        } else {
            Either::Right(foo)
        }
    });

    println!("{:?}, {:?}", b, c);
}
0 голосов
/ 25 марта 2019

Чтобы получить индекс при итерации по Iterator, вы можете использовать Iterator::enumerate.

let arr = [1, 2, 3, 4];
let (a, b): (Vec<_>, Vec<_>) = arr.iter().enumerate().partition(|(i, _)| i % 2 == 0);

Проблема состоит в том, чтобы "не перечислить" вектор. Для этого вы можете использовать эту функцию:

fn unenumerate<T>(a: impl IntoIterator<Item = (usize, T)>) -> Vec<T> {
    a.into_iter().map(|(_, e)| e).collect()
}

В сочетании это позволит вам получить желаемый результат:

println!("{:?} {:?}", unenumerate(a), unenumerate(b)); // [1, 3] [2, 4]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...