Skip to content

Commit 1119e9c

Browse files
authored
Merge pull request #251 from Xion/master
Add Itertools::sorted_by_key
2 parents b7084a2 + 711cd95 commit 1119e9c

File tree

2 files changed

+41
-0
lines changed

2 files changed

+41
-0
lines changed

src/lib.rs

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1661,6 +1661,38 @@ pub trait Itertools : Iterator {
16611661
v
16621662
}
16631663

1664+
/// Collect all iterator elements into a sorted vector.
1665+
///
1666+
/// **Note:** This consumes the entire iterator, uses the
1667+
/// `slice::sort_by_key()` method and returns the sorted vector.
1668+
///
1669+
/// ```
1670+
/// use itertools::Itertools;
1671+
///
1672+
/// // sort people in descending order by age
1673+
/// let people = vec![("Jane", 20), ("John", 18), ("Jill", 30), ("Jack", 27)];
1674+
///
1675+
/// let oldest_people_first = people
1676+
/// .into_iter()
1677+
/// .sorted_by_key(|x| -x.1)
1678+
/// .into_iter()
1679+
/// .map(|(person, _age)| person);
1680+
///
1681+
/// itertools::assert_equal(oldest_people_first,
1682+
/// vec!["Jill", "Jack", "Jane", "John"]);
1683+
/// ```
1684+
#[cfg(feature = "use_std")]
1685+
fn sorted_by_key<K, F>(self, f: F) -> Vec<Self::Item>
1686+
where Self: Sized,
1687+
K: Ord,
1688+
F: FnMut(&Self::Item) -> K,
1689+
{
1690+
let mut v: Vec<Self::Item> = self.collect();
1691+
1692+
v.sort_by_key(f);
1693+
v
1694+
}
1695+
16641696
/// Collect all iterator elements into one of two
16651697
/// partitions. Unlike `Iterator::partition`, each partition may
16661698
/// have a distinct type.

tests/test_std.rs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -275,6 +275,15 @@ fn sorted_by() {
275275
assert_eq!(v, vec![4, 3, 2, 1, 0]);
276276
}
277277

278+
#[test]
279+
fn sorted_by_key() {
280+
let sc = [3, 4, 1, 2].iter().cloned().sorted_by_key(|&x| x);
281+
assert_eq!(sc, vec![1, 2, 3, 4]);
282+
283+
let v = (0..5).sorted_by_key(|&x| -x);
284+
assert_eq!(v, vec![4, 3, 2, 1, 0]);
285+
}
286+
278287
#[test]
279288
fn test_multipeek() {
280289
let nums = vec![1u8,2,3,4,5];

0 commit comments

Comments
 (0)