我有一个地图列表,每个地图都有一个键,说明项目插入到我的数据库中的“inserted_at”时间。我想按降序排列此列表,以首先显示最新的项目。我以为我拥有它,但当仔细观察时,由于某种原因,第二个和第三个元素以及第五个和第六个元素应该交换。
有什么想法吗?
那是因为你正在比较 Elixir 中的
NaiveDateTime
。
您应该使用比较方法而不是
==, >, <
。
例如,
Enum.sort(z, &(NaiveDateTime.compare(&1, &2)==:gt ))
。
根据下面的 Elixir v10 的发行说明,此问题应该已本地修复。
Elixir v1.10 通过引入 :asc 和 :desc 快捷方式简化了排序功能:
iex> Enum.sort(["banana", "apple", "pineapple"], :asc)
["apple", "banana", "pineapple"]
iex> Enum.sort(["banana", "apple", "pineapple"], :desc)
["pineapple", "banana", "apple"]
以及添加传递模块来执行语义比较的可能性。例如,要对日期进行排序,现在只需要传递 Date 模块甚至 {:desc, Date} 即可进行降序语义排序:
iex> Enum.sort([~D[2019-12-31], ~D[2020-01-01]], Date)
[~D[2019-12-31], ~D[2020-01-01]]
iex> Enum.sort([~D[2019-12-31], ~D[2020-01-01]], {:desc, Date})
[~D[2020-01-01], ~D[2019-12-31]]
这些 API 改进使代码更加简洁和可读,并且它们也已添加到 Enum.sort_by、Enum.min_by、Enum.max_by 等中。
总结(自 Elixir v1.10 起):
... |> Enum.sort_by(& &1.inserted_at, NaiveDateTime)
... |> Enum.sort_by(& &1.inserted_at, {:desc, NaiveDateTime})
[~D[2019-12-31], ~D[2020-01-01]] |> Enum.sort(Date)
[~D[2019-12-31], ~D[2020-01-01]] |> Enum.sort({:desc, Date})
默认情况下,“地图”不提供“排序顺序”。不确定我在看什么或它是什么语言。在 Java 中,您将使用这种类型的集合:http://tutorials.jenkov.com/java-collections/sortedmap.html