How can I co-sort two Vecs based on the values in one of the Vecs?

倾然丶 夕夏残阳落幕 提交于 2020-05-26 10:32:16

问题


I have two Vecs that correspond to a list of feature vectors and their corresponding class labels, and I'd like to co-sort them by the class labels.

However, Rust's sort_by operates on a slice rather than being a generic function over a trait (or similar), and the closure only gets the elements to be compared rather than the indices so I can sneakily hack the sort to be parallel.

I've considered the solution:

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

I'd prefer not to allocate a whole new vector to do this every time because the size of the data can be extremely large.

I can always implement my own sort, of course, but if there's a builtin way to do this it would be much better.


回答1:


I just wrote a crate "permutation" that allows you to do this :)

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]);

It likely will support this in a single function call in the future.



来源:https://stackoverflow.com/questions/32564455/how-can-i-co-sort-two-vecs-based-on-the-values-in-one-of-the-vecs

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!