當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


Elixir Enum.sort用法及代碼示例


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 ,它將比較它們的結構。在比較結構時,字段按字母順序進行比較,這意味著上麵的日期將按 daymonthyear 進行比較,這與我們想要的相反。

出於這個原因,大多數結構都提供了一個"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-lang.org大神的英文原創作品 Enum.sort(enumerable)。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。