Elixir:按名称排序列表

时间:2018-04-16 22:23:30

标签: elixir

我是否可以在Elixir中这样做,例如对命名列表进行排序?

list = [9,1,2,3]
Enum.sort(list)

制作

[1,2,3,9]

因为我不知道列表中的数字是什么,所以我无法专门输入这些数字。

2 个答案:

答案 0 :(得分:4)

如果通过对命名列表进行排序,您打算就地排序,我认为这是不可能的,因为值在elixir中是不可变的。

然而,您可以重新绑定原始变量,使其指向新值:

iex(1)> l = [9,1,2,3]
[9, 1, 2, 3]
iex(2)> l = Enum.sort(l)
[1, 2, 3, 9]
iex(3)> l
[1, 2, 3, 9]

如果通过命名列表表示keyword,您也可以使用Enum.sort/2对其进行排序。要按值对关键字进行排序,您可以执行以下操作:

iex(1)> k = [a: 32, b: 15] 
[a: 32, b: 15]
iex(2)> Keyword.keyword?(k)
true
iex(3)> Enum.sort(k, fn({_, v1}, {_, v2}) -> v1 <= v2 end)
[b: 15, a: 32]

答案 1 :(得分:0)

我还希望将列表按升序和降序排序。对于ASC订单,我们只需要Enum.sort(),但是当反转订单时,我们需要在排序时添加比较功能。

a = [191, 192, 189, 190, 193, 194, 195, 196, 197, 198]

asc = Enum.sort(a)

IO.inspect(asc, charlists: :as_lists) # [189, 190, 191, 192, 193, 194, 195, 196, 197, 198]

des = Enum.sort(list_append, &(&1 >= &2))
IO.inspect(asc, charlists: :as_lists) #[198, 197, 196, 195, 194, 193, 192, 191, 190, 189]