【问题标题】:Split vector by a field, preserving order按字段拆分向量,保留顺序
【发布时间】:2023-04-08 13:35:01
【问题描述】:

在 Rust 中有一种简单的方法可以像这样拆分向量:

let original_vec = vec![
    (14, "Foo", 62.3),
    (17, "Foo", 77.8),
    (25, "Bar", 33.7),
    (27, "Bar", 99.2),
    (61, "Foo", 17.4),
    (64, "Bar", 55.5),
    (77, "Bar", 31.2),
];

进入这个:

let res = vec![
    vec![
        (14, "Foo", 62.3),
        (17, "Foo", 77.8),
    ],
    vec![
        (25, "Bar", 33.7),
        (27, "Bar", 99.2),
    ],
    vec![
        (61, "Foo", 17.4),  // "Foo" again
    ],
    vec![
        (61, "Bar", 55.5),  // A separate group of "Bars"
        (77, "Bar", 31.2),
    ],
]

澄清一下:我想通过其元素中的一个字段来拆分我的输入向量。只有具有相同字段值的连续元素必须放入子向量中。 “扁平化”结果向量必须与原始向量具有相同的顺序。

【问题讨论】:

    标签: vector rust


    【解决方案1】:

    我找到了我正在寻找的东西:

    original_vec.group_by(|a, b| a.1 == b.1)
    

    但是,group_by 方法在撰写本文时仅适用于 Nightly,并且需要添加:

    #![feature(slice_group_by)]
    

    作为替代方案,正如 Sebastian 建议的那样,可以使用来自 itertools crate 的 group_by()

    【讨论】:

    • 或者,使用group_by from Itertools
    • 哦,任何时候你使用#![feature],你都需要使用 Rust 的 Nightly 版本。这可能会让新手感到困惑。
    • @SebastianRedl 好点!谢谢!
    • 请不要宣传 nightly Rust 功能作为在 Rust 中完成某事的方式(除非问题是专门关于仅由 nightly 支持的东西,例如便携式 SIMD、高级 const 泛型、GAT 等) . Nightly 基本上是一个用于编译器和 stdlib 开发的 beta 测试程序,不适合随意使用。
    • @user4815162342 好点!我每晚都在使用,但显然不是每个人都这样做。我用澄清更新了我的答案。
    【解决方案2】:

    基本上我想象以下解决方案

    let original_vec = vec![
        (14, "Foo", 62.3),
        (17, "Foo", 77.8),
        (25, "Bar", 33.7),
        (27, "Bar", 99.2),
        (61, "Foo", 17.4),
        (64, "Bar", 55.5),
        (77, "Bar", 31.2),
    ];
    
    
    type DATA = (i32, &'static str, f32);
    
    let mut t: Vec<Vec<DATA>> = Vec::new();
    let mut q: Vec<DATA> = Vec::new();
    let mut p: DATA = (0, "", 0.0);
    
    for i in original_vec
    {
        if i.1 != p.1 && p.1 != "" {
            t.push(q);
            q = Vec::new();    
            q.push(i);
        }
        
        q.push(i);
        p = i;
    }
    
    println!("{:?}", t);
    

    【讨论】:

      猜你喜欢
      • 2021-08-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-01
      相关资源
      最近更新 更多