如何根据其中一个Vecs中的值对两个Vecs进行共同排序?

Lin*_*ope 14 rust

我有两个Vecs对应于一个特征向量列表及其对应的类标签,我想按类标签对它们进行共同排序.

但是,Rust's sort_by在一个切片上运行而不是在特征(或类似)上的泛型函数,并且闭包只获得要比较的元素而不是索引,所以我可以偷偷地破解这种并行的排序.

我考虑过这个解决方案:

let mut both = data.iter().zip(labels.iter()).collect();
both.sort_by( blah blah );
// Now split them back into two vectors
Run Code Online (Sandbox Code Playgroud)

我不希望每次都分配一个全新的矢量,因为数据的大小可能非常大.

当然,我总是可以实现自己的排序,但如果有一种内置的方法可以做到这一点,那就更好了.

Jer*_*wen 12

我刚刚写了一个板条箱“排列”,允许你这样做:)

let names = vec!["Bob", "Steve", "Jane"];
let salary = vec![10, 5, 15];
let permutation = permutation::sort(&salary[..]);
let ordered_names = permutation.apply_slice(&names[..]);
let ordered_salaries = permutation.apply_slice(&salary[..]);
assert!(ordered_names == vec!["Steve", "Bob", "Jane"]);
assert!(ordered_salaries == vec![5, 10, 15]);
Run Code Online (Sandbox Code Playgroud)

将来它可能会在单个函数调用中支持这一点。

  • 我已将许可证更新为 Apache / MIT 下的双重许可,就像 Rust 一样。 (8认同)
  • 感谢您为 Rust 社区做出贡献。就我而言,遗憾的是,这是根据 GPL 而非 MIT / Apache 获得许可的,就像大多数 Rust 库一样。 (4认同)
  • @orlp你有基准还是这只是猜测? (2认同)