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)。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。