给定一个值列表,例如vec![0, 0, 1, 2],我想创建一个迭代器来生成其所有独特的排列。那是,
[0, 0, 1, 2]
[0, 0, 2, 1]
[0, 1, 0, 2]
[0, 1, 2, 0]
[0, 2, 0, 1]
[0, 2, 1, 0]
[1, 0, 0, 2]
[1, 0, 2, 0]
[1, 2, 0, 0]
[2, 0, 0, 1]
[2, 0, 1, 0]
[2, 1, 0, 0]
Run Code Online (Sandbox Code Playgroud)
(请注意,有 12 种不同的排列,而如果我们有 4 个不同的元素,则会有 24 种不同的排列)。
已经有一种方法可以使用itertools 包生成排列(以及其他迭代器,如组合或没有替换的组合),但对于排列,没有办法将排列限制为唯一的排列。
有一种相当有效的算法来生成排列,通常称为堆算法,但这并没有考虑值的相等性/重复性。
这个问题在带有生成器的语言中实现并不是太棘手,比如 Python,但我觉得这在 Rust 中更棘手(至少与上面的解决方案相比),因为它需要使用迭代器(它必须保持内部状态) ,或使用生成器(目前不稳定)。
有关字符串文字类型的示例,请参阅此 TypeScript 文档:https://www.typescriptlang.org/docs/handbook/2/everyday-types.html#literal-types
对于示例用例,我希望能够创建一个用于对表格数据执行操作的库,其中表的列被命名并具有异构类型。
假设我有一张这样的表:
| name | age | quiz1 | quiz2 | midterm | quiz3 | quiz4 | final |
| ------- | --- | ----- | ----- | ------- | ----- | ----- | ----- |
| "Bob" | 12 | 8 | 9 | 77 | 7 | 9 | 87 |
| "Alice" | 17 | 6 | 8 | 88 | 8 | 7 | 85 |
| "Eve" | 13 | 7 …Run Code Online (Sandbox Code Playgroud)