【发布时间】:2018-08-10 21:39:29
【问题描述】:
Elixir 程序员们好。
我有大约 2.500 首音乐曲目的列表,我想按不同的参数(例如曲目的标题)进行排序。
排序应该不区分大小写。
下面的代码可以工作,但需要大约 100 毫秒到 130 毫秒来对列表进行排序。有更快的方法吗?我的一个参考是 Node.js,它在使用 Array.prototype.sort 时在大约 25 毫秒内完成。
编辑:对不起,我实际上放错了时间。排序发生在大约 30 毫秒内。不过,我还是想听听你的意见:排序能不能快点?
谢谢。
defmodule MusicServer.Tracks.SortTracks do
def sort_tracks(tracks, "title", "desc") do
Enum.sort(tracks, fn track1, track2 ->
first_char(track1["title"]) <= first_char(track2["title"])
end)
end
def first_char(string) do
string
|> String.at(0)
|> String.downcase()
end
end
数据结构示例:
[
%{
"artist" => "Rolling Stones",
"title" => "Start It Up",
"bpm" => 100,
"createdAt" => "2018-04-27T09:08:04.428Z",
"updatedAt" => "2018-07-14T14:28:17.771Z"
},
%{
"artist" => "Al Green",
"title" => "Let's Stay Together",
"bpm" => 123,
"createdAt" => "2018-04-27T09:08:04.428Z",
"updatedAt" => "2018-07-14T14:28:17.771Z"
},
...
]
【问题讨论】:
-
你能试试计时
Enum.sort_by(tracks, fn track -> first_char(track["title"]) end)吗? -
超快!当我按照您的建议使用
Enum.sort_by时,{time, result} = :timer.tc (fn -> MusicServer.Tracks.SortTracks.sort_tracks(tracks, "title", "desc") end)给我 7433、6969、6356(微秒)...谢谢! -
可读性更强!
-
我很好奇为什么会这样。有什么想法吗,Dogbert?
-
至少,它首先计算每个标题的第一个字符,然后开始排序github.com/elixir-lang/elixir/blob/v1.7.2/lib/elixir/lib/…
标签: elixir