当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


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)。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。