Elixir语言中 Enum.sort
相关用法介绍如下。
用法一
sort(enumerable)
@spec sort(t()) :: list()
根据 Erlang 的术语排序对 enumerable
进行排序。
该函数使用归并排序算法。不要使用此函数对结构进行排序,有关详细信息,请参阅
。sort/2
例子
iex> Enum.sort([3, 2, 1])
[1, 2, 3]
用法二
sort(enumerable, fun)
@spec sort(
t(),
(element(), element() -> boolean())
| :asc
| :desc
| module()
| {:asc | :desc, module()}
) :: list()
按给定函数对enumerable
进行排序。
该函数使用归并排序算法。给定的函数应该比较两个参数,如果第一个参数在第二个参数之前或在同一个位置,则返回true
。
例子
iex> Enum.sort([1, 2, 3], &(&1 >= &2))
[3, 2, 1]
只要给定函数为被认为相等的值返回true
,排序算法就会稳定:
iex> Enum.sort(["some", "kind", "of", "monster"], &(byte_size(&1) <= byte_size(&2)))
["of", "some", "kind", "monster"]
如果函数不为相等的值返回true
,则排序不稳定,相等项的顺序可能会打乱。例如:
iex> Enum.sort(["some", "kind", "of", "monster"], &(byte_size(&1) < byte_size(&2)))
["of", "kind", "some", "monster"]
上升和下降
允许开发者传递sort/2
:asc
或:desc
作为排序函数,分别为
和<=/2
提供方便。>=/2
iex> Enum.sort([2, 3, 1], :asc)
[1, 2, 3]
iex> Enum.sort([2, 3, 1], :desc)
[3, 2, 1]
排序结构
排序结构时不要使用
、 </2
、 <=/2
、 >/2
和朋友。这是因为上面的内置运算符执行的是结构比较,而不是语义比较。假设我们对以下日期列表进行排序:>=/2
iex> dates = [~D[2019-01-01], ~D[2020-03-02], ~D[2019-06-06]]
iex> Enum.sort(dates)
[~D[2019-01-01], ~D[2020-03-02], ~D[2019-06-06]]
请注意,返回的结果是不正确的,因为
默认使用 sort/1
,它将比较它们的结构。在比较结构时,字段按字母顺序进行比较,这意味着上面的日期将按 <=/2
day
、 month
和 year
进行比较,这与我们想要的相反。
出于这个原因,大多数结构都提供了一个"compare"函数,例如
,它接收两个结构并返回Date.compare/2
:lt
(小于)、:eq
(等于)和:gt
(大于)。如果你传递一个模块作为排序函数,Elixir 会自动使用该模块的compare/2
函数:
iex> dates = [~D[2019-01-01], ~D[2020-03-02], ~D[2019-06-06]]
iex> Enum.sort(dates, Date)
[~D[2019-01-01], ~D[2019-06-06], ~D[2020-03-02]]
要按降序检索所有日期,您可以将模块包装在以:asc
或:desc
作为第一个元素的元组中:
iex> dates = [~D[2019-01-01], ~D[2020-03-02], ~D[2019-06-06]]
iex> Enum.sort(dates, {:asc, Date})
[~D[2019-01-01], ~D[2019-06-06], ~D[2020-03-02]]
iex> dates = [~D[2019-01-01], ~D[2020-03-02], ~D[2019-06-06]]
iex> Enum.sort(dates, {:desc, Date})
[~D[2020-03-02], ~D[2019-06-06], ~D[2019-01-01]]
相关用法
- Elixir Enum.sort_by用法及代码示例
- Elixir Enum.split_with用法及代码示例
- Elixir Enum.sum用法及代码示例
- Elixir Enum.slice用法及代码示例
- Elixir Enum.split用法及代码示例
- Elixir Enum.split_while用法及代码示例
- Elixir Enum.shuffle用法及代码示例
- Elixir Enum.scan用法及代码示例
- Elixir Enum.slide用法及代码示例
- Elixir Enum.unzip用法及代码示例
- Elixir Enum.min_max用法及代码示例
- Elixir Enum.reduce_while用法及代码示例
- Elixir Enum.at用法及代码示例
- Elixir Enum.dedup用法及代码示例
- Elixir Enum.zip用法及代码示例
- Elixir Enum.find_value用法及代码示例
- Elixir Enum.product用法及代码示例
- Elixir Enum.map_join用法及代码示例
- Elixir Enum.zip_with用法及代码示例
- Elixir Enum.intersperse用法及代码示例
- Elixir Enum.flat_map用法及代码示例
- Elixir Enum.count用法及代码示例
- Elixir Enum.fetch用法及代码示例
- Elixir Enum.frequencies用法及代码示例
- Elixir Enum.drop用法及代码示例
注:本文由纯净天空筛选整理自elixir-lang.org大神的英文原创作品 Enum.sort(enumerable)。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。