新增章节 [Cookbook - Vec排序]

pull/696/head
sunface 3 years ago
parent 5a2251f61f
commit c64bc79e9b

@ -266,6 +266,7 @@
- [CookBook doing](cookbook/intro.md) - [CookBook doing](cookbook/intro.md)
- [常用算法]() - [常用算法]()
- [生成随机值](cookbook/algos/randomness.md) - [生成随机值](cookbook/algos/randomness.md)
- [Vec 排序](cookbook/algos/sorting.md)
- [命令行解析 todo](cookbook/cmd.md) - [命令行解析 todo](cookbook/cmd.md)
- [配置文件解析 todo](cookbook/config.md) - [配置文件解析 todo](cookbook/config.md)
- [编解码 todo](cookbook/encoding/intro.md) - [编解码 todo](cookbook/encoding/intro.md)

@ -1,6 +1,6 @@
# 生成随机值 # 生成随机值
## 生成随机数 ### 生成随机数
使用 [rand::thread_rng](https://docs.rs/rand/*/rand/fn.thread_rng.html) 可以获取一个随机数生成器 [rand::Rng](https://docs.rs/rand/0.8.5/rand/trait.Rng.html) ,该生成器需要在每个线程都初始化一个。 使用 [rand::thread_rng](https://docs.rs/rand/*/rand/fn.thread_rng.html) 可以获取一个随机数生成器 [rand::Rng](https://docs.rs/rand/0.8.5/rand/trait.Rng.html) ,该生成器需要在每个线程都初始化一个。
@ -22,7 +22,7 @@ fn main() {
} }
``` ```
## 指定范围生成随机数 ### 指定范围生成随机数
使用 [Rng::gen_range](https://rust-lang-nursery.github.io/rust-cookbook/algorithms/randomness.html) 生成 [0, 10) 区间内的随机数( 右开区间,不包括 `10` )。 使用 [Rng::gen_range](https://rust-lang-nursery.github.io/rust-cookbook/algorithms/randomness.html) 生成 [0, 10) 区间内的随机数( 右开区间,不包括 `10` )。
```rust,editable ```rust,editable
@ -54,7 +54,7 @@ fn main() {
} }
``` ```
## 使用指定分布来生成随机数 ### 使用指定分布来生成随机数
默认情况下,`rand` 包使用均匀分布来生成随机数,而 [rand_distr](https://docs.rs/rand_distr/*/rand_distr/index.html) 包提供了其它类型的分布方式。 默认情况下,`rand` 包使用均匀分布来生成随机数,而 [rand_distr](https://docs.rs/rand_distr/*/rand_distr/index.html) 包提供了其它类型的分布方式。
@ -74,7 +74,7 @@ fn main() -> Result<(), NormalError> {
} }
``` ```
## 在自定义类型中生成随机值 ### 在自定义类型中生成随机值
使用 [Distribution](https://docs.rs/rand/*/rand/distributions/trait.Distribution.html) 特征包裹我们的自定义类型,并为 [Standard](https://docs.rs/rand/*/rand/distributions/struct.Standard.html) 实现该特征,可以为自定义类型的指定字段生成随机数。 使用 [Distribution](https://docs.rs/rand/*/rand/distributions/trait.Distribution.html) 特征包裹我们的自定义类型,并为 [Standard](https://docs.rs/rand/*/rand/distributions/struct.Standard.html) 实现该特征,可以为自定义类型的指定字段生成随机数。
@ -113,7 +113,7 @@ fn main() {
} }
``` ```
## 生成随机的字符串(A-Z, a-z, 0-9) ### 生成随机的字符串(A-Z, a-z, 0-9)
通过 [Alphanumeric](https://docs.rs/rand/0.8.5/rand/distributions/struct.Alphanumeric.html) 采样来生成随机的 ASCII 字符串,包含从 `A-Z, a-z, 0-9` 的字符。 通过 [Alphanumeric](https://docs.rs/rand/0.8.5/rand/distributions/struct.Alphanumeric.html) 采样来生成随机的 ASCII 字符串,包含从 `A-Z, a-z, 0-9` 的字符。
```rust,editble ```rust,editble
@ -131,7 +131,7 @@ fn main() {
} }
``` ```
## 生成随机的字符串( 用户指定 ASCII 字符 ) ### 生成随机的字符串( 用户指定 ASCII 字符 )
通过 [gen_string](https://docs.rs/rand/0.8.5/rand/trait.Rng.html#method.gen_range) 生成随机的 ASCII 字符串,包含用户指定的字符。 通过 [gen_string](https://docs.rs/rand/0.8.5/rand/trait.Rng.html#method.gen_range) 生成随机的 ASCII 字符串,包含用户指定的字符。
```rust,editable ```rust,editable

@ -0,0 +1,84 @@
## Vector 排序
### 对整数 Vector 排序
以下示例使用 [Vec::sort](https://doc.rust-lang.org/std/vec/struct.Vec.html#method.sort) 来排序,如果大家希望获得更高的性能,可以使用 [Vec::sort_unstable](https://doc.rust-lang.org/std/vec/struct.Vec.html#method.sort_unstable),但是该方法无法保留相等元素的顺序。
```rust,editable
fn main() {
let mut vec = vec![1, 5, 10, 2, 15];
vec.sort();
assert_eq!(vec, vec![1, 2, 5, 10, 15]);
}
```
### 对浮点数 Vector 排序
浮点数数组可以使用 [Vec::sort_by](https://doc.rust-lang.org/std/primitive.slice.html#method.sort_by) 和 [PartialOrd::partial_cmp](https://doc.rust-lang.org/std/cmp/trait.PartialOrd.html#tymethod.partial_cmp) 进行排序。
```rust,editable
fn main() {
let mut vec = vec![1.1, 1.15, 5.5, 1.123, 2.0];
vec.sort_by(|a, b| a.partial_cmp(b).unwrap());
assert_eq!(vec, vec![1.1, 1.123, 1.15, 2.0, 5.5]);
}
```
### 对结构体 Vector 排序
以下示例中的结构体 `Person` 将实现基于字段 `name``age` 的自然排序。为了让 `Person` 变为可排序的,我们需要为其派生 `Eq、PartialEq、Ord、PartialOrd` 特征,关于这几个特征的详情,请见[这里](https://course.rs/advance/confonding/eq.html)。
当然,还可以使用 [vec:sort_by](https://doc.rust-lang.org/std/vec/struct.Vec.html#method.sort_by) 方法配合一个自定义比较函数,只按照 `age` 的维度对 `Person` 数组排序。
```rust,editable
#[derive(Debug, Eq, Ord, PartialEq, PartialOrd)]
struct Person {
name: String,
age: u32
}
impl Person {
pub fn new(name: String, age: u32) -> Self {
Person {
name,
age
}
}
}
fn main() {
let mut people = vec![
Person::new("Zoe".to_string(), 25),
Person::new("Al".to_string(), 60),
Person::new("John".to_string(), 1),
];
// 通过派生后的自然顺序(Name and age)排序
people.sort();
assert_eq!(
people,
vec![
Person::new("Al".to_string(), 60),
Person::new("John".to_string(), 1),
Person::new("Zoe".to_string(), 25),
]);
// 只通过 age 排序
people.sort_by(|a, b| b.age.cmp(&a.age));
assert_eq!(
people,
vec![
Person::new("Al".to_string(), 60),
Person::new("Zoe".to_string(), 25),
Person::new("John".to_string(), 1),
]);
}
```
Loading…
Cancel
Save