时间戳列表未正确排序

问题描述 投票:0回答:4

我有一个地图列表,每个地图都有一个键,说明项目插入到我的数据库中的“inserted_at”时间。我想按降序排列此列表,以首先显示最新的项目。我以为我拥有它,但当仔细观察时,由于某种原因,第二个和第三个元素以及第五个和第六个元素应该交换。

有什么想法吗?

sorting elixir phoenix-framework
4个回答
9
投票

那是因为你正在比较 Elixir 中的

NaiveDateTime

您应该使用比较方法而不是

==, >, <

例如,

Enum.sort(z, &(NaiveDateTime.compare(&1, &2)==:gt ))


1
投票

根据下面的 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 等中。


0
投票

总结(自 Elixir v1.10 起):

按 Insert_at(日期和时间)排序:

... |> 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})

-3
投票

默认情况下,“地图”不提供“排序顺序”。不确定我在看什么或它是什么语言。在 Java 中,您将使用这种类型的集合:http://tutorials.jenkov.com/java-collections/sortedmap.html

© www.soinside.com 2019 - 2024. All rights reserved.