【问题标题】:How to sort a Rust Vector with map-like closures?如何使用类似地图的闭包对 Rust 向量进行排序?
【发布时间】:2021-05-26 08:34:08
【问题描述】:

我想使用某种类似于闭包的格式对结构向量进行排序。这就是我的想法:

struct PointTracker {
    positive: u32,
    negative: u32,
}

// ....

fn main() {
    let item: Vec<PointTracker> // ....

    // e.g: [{positive: 3, negative: 4}, {positive: 5, negative: 0}, {positive: 2, negative: 10}]
    
    let sorted_item = item
        .iter()
        .sort_with(|x: PointTracker| x.positive - x.negative)
        .collect::<PointTracker>();

    // sorted from greatest to least:
    // [{positive: 5, negative: 0}, {positive: 3, negative: 4}, {positive:2, negative: 10}]
}

我一直在寻找某种函数,就像上面一样,它根据闭包中返回的值对项目进行排序。这取正值,从中减去负值,然后返回结果。第一个未排序项目的总和将是:[-1, 5, -8],排序后的总和将是(如预期的那样):[5, -1, -8]

这个函数是否有某种板条箱,或者如果它不存在我应该自己编写?

【问题讨论】:

  • doc.rust-lang.org/stable/std/vec/… - 这是你需要的吗?
  • 您不能对通用迭代器进行排序,因为它们不允许随机访问。但是您可以使用sort_by 和朋友对向量或切片进行排序。

标签: sorting rust iterator closures


【解决方案1】:

你要搜索的函数是sort_by_key:

#[derive(Debug)]
struct PointTracker {
    positive: u32,
    negative: u32,
}

fn main() {
    let mut item = vec![
        PointTracker {
            positive: 3,
            negative: 4,
        },
        PointTracker {
            positive: 5,
            negative: 0,
        },
        PointTracker {
            positive: 2,
            negative: 10,
        },
    ];

    item.sort_by_key(|x| x.positive as i32 - x.negative as i32);

    println!("{:#?}", item);
}

输出:

[
    PointTracker {
        positive: 2,
        negative: 10,
    },
    PointTracker {
        positive: 3,
        negative: 4,
    },
    PointTracker {
        positive: 5,
        negative: 0,
    },
]

【讨论】:

  • 此外,sort_by_keysort_unstable_by_key 之间的差异可能值得一提,或者像 Itertools 这样的板条箱按照作者的想法进行操作,请参阅:sorted_by_key() 和 @ 987654323@.
  • 对此赞不绝口,Jason,非常感谢 Rabbid76。出于某种原因,sort_by_key 没有给我我需要的结果,所以我改用itertools,我得到了我想要的实现。
猜你喜欢
  • 2021-12-19
  • 2015-01-06
  • 1970-01-01
  • 2018-01-08
  • 2021-09-10
  • 2013-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多