我是否可以在Elixir中这样做,例如对命名列表进行排序?
list = [9,1,2,3]
Enum.sort(list)
制作
[1,2,3,9]
因为我不知道列表中的数字是什么,所以我无法专门输入这些数字。
答案 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]