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


Elixir Enum.sort_by用法及代碼示例


Elixir語言中 Enum.sort_by 相關用法介紹如下。

用法:

sort_by(enumerable, mapper, sorter \\ &<=/2)
@spec sort_by(
  t(),
  (element() -> mapped_element),
  (element(), element() -> boolean())
  | :asc
  | :desc
  | module()
  | {:asc | :desc, module()}
) :: list()
when mapped_element: element()

根據提供的sorter函數對enumerable的映射結果進行排序。

此函數使用提供的mapper 函數映射enumerable 的每個元素。然後使用 sorter 函數按映射元素對可枚舉進行排序,該函數默認為 Kernel.<=/2

sort_by/3 sort/2 的不同之處在於它隻計算可枚舉中每個元素的比較值一次,而不是每次比較中的每個元素計算一次。如果在兩個元素上調用相同的函數,則使用 sort_by/3 會更有效。

例子

使用 <=/2 的默認 sorter

iex> Enum.sort_by(["some", "kind", "of", "monster"], &byte_size/1)
["of", "some", "kind", "monster"]

按多個屬性排序 - 首先按大小,然後按第一個字母(這利用了元組逐個元素比較的事實):

iex> Enum.sort_by(["some", "kind", "of", "monster"], &{byte_size(&1), String.first(&1)})
["of", "kind", "some", "monster"]

sort/2 類似,您可以傳遞自定義排序器:

iex> Enum.sort_by(["some", "kind", "of", "monster"], &byte_size/1, &>=/2)
["monster", "some", "kind", "of"]

或使用 :asc:desc

iex> Enum.sort_by(["some", "kind", "of", "monster"], &byte_size/1, :desc)
["monster", "some", "kind", "of"]

sort/2 一樣,避免使用默認排序函數對結構進行排序,因為默認情況下它執行結構比較而不是語義比較。在這種情況下,您應將排序函數作為第三個元素或任何實現compare/2 函數的模塊傳遞。例如,要分別按用戶的生日升序和降序對用戶進行排序:

iex> users = [
...>   %{name: "Ellis", birthday: ~D[1943-05-11]},
...>   %{name: "Lovelace", birthday: ~D[1815-12-10]},
...>   %{name: "Turing", birthday: ~D[1912-06-23]}
...> ]
iex> Enum.sort_by(users, &(&1.birthday), Date)
[
  %{name: "Lovelace", birthday: ~D[1815-12-10]},
  %{name: "Turing", birthday: ~D[1912-06-23]},
  %{name: "Ellis", birthday: ~D[1943-05-11]}
]
iex> Enum.sort_by(users, &(&1.birthday), {:desc, Date})
[
  %{name: "Ellis", birthday: ~D[1943-05-11]},
  %{name: "Turing", birthday: ~D[1912-06-23]},
  %{name: "Lovelace", birthday: ~D[1815-12-10]}
]

相關用法


注:本文由純淨天空篩選整理自elixir-lang.org大神的英文原創作品 Enum.sort_by(enumerable, mapper, sorter \\ &<=/2)。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。