2017-01-14 26 views
6

Tôi đã tập hợp một tập lệnh nhỏ để giúp tôi với quy trình khôi phục chấn thương. Nó xuất ra những gì tôi mong đợi, tuy nhiên ngày tháng dường như không phân loại như tôi mong đợi - có vẻ như sắp xếp theo tháng/ngày đang hoạt động, nhưng không phải theo năm. Cùng một kết quả nếu tôi chỉ phân loại danh sách ngày tháng và không sử dụng cấu trúc.Sắp xếp danh sách Ngày ở Elixir

Lưu ý phụ, sử dụng https://github.com/lau/calendar để điền phạm vi ngày của tôi.

defmodule Phase do 
    defstruct day: "", weight: "" 
end 

defmodule Recovery do 
    alias Calendar.Date 

    def phases(start_date, end_date, start_weight, increase_by) do 
    # Get the range of dates 
    date_range = Date.days_after_until(start_date, end_date, true) |> Enum.to_list 

    # build all phases, starting at day 0 
    values = do_phases(date_range, [], start_weight, increase_by) 
    Enum.sort_by(values, &(&1.day)) 
    end 

    defp do_phases([], recovery_plan, _weight, _increase_by), do: recovery_plan 
    defp do_phases([head | tail], recovery_plan, weight, increase_by) do 
    v = [%Phase{day: head, weight: weight} | recovery_plan] 
    do_phases(tail, v, weight + increase_by, increase_by) 
    end 
end 

Chạy trong IEX kết quả đầu ra như sau:

iex(18)> d1 = Date.from_erl! {2016, 12, 29} 
iex(19)> d2 = Date.from_erl! {2017, 1, 19} 
iex(24)> Recovery.phases(d1, d2, 30, 5) 
[%Phase{day: ~D[2017-01-01], weight: 45}, 
%Phase{day: ~D[2017-01-02], weight: 50}, 
%Phase{day: ~D[2017-01-03], weight: 55}, 
%Phase{day: ~D[2017-01-04], weight: 60}, 
%Phase{day: ~D[2017-01-05], weight: 65}, 
%Phase{day: ~D[2017-01-06], weight: 70}, 
%Phase{day: ~D[2017-01-07], weight: 75}, 
%Phase{day: ~D[2017-01-08], weight: 80}, 
%Phase{day: ~D[2017-01-09], weight: 85}, 
%Phase{day: ~D[2017-01-10], weight: 90}, 
%Phase{day: ~D[2017-01-11], weight: 95}, 
%Phase{day: ~D[2017-01-12], weight: 100}, 
%Phase{day: ~D[2017-01-13], weight: 105}, 
%Phase{day: ~D[2017-01-14], weight: 110}, 
%Phase{day: ~D[2017-01-15], weight: 115}, 
%Phase{day: ~D[2017-01-16], weight: 120}, 
%Phase{day: ~D[2017-01-17], weight: 125}, 
%Phase{day: ~D[2017-01-18], weight: 130}, 
%Phase{day: ~D[2017-01-19], weight: 135}, 
%Phase{day: ~D[2016-12-29], weight: 30}, 
%Phase{day: ~D[2016-12-30], weight: 35}, 
%Phase{day: ~D[2016-12-31], weight: 40}] 

Trả lời

9

Nó có vẻ như các struct ngày từ thư viện bạn đang sử dụng trông như sau: %Date{day: 25, month: 12, year: 2014}. Trong các cấu trúc Elixir được so sánh với nội dung của chúng, theo thứ tự bảng chữ cái của các trường. Trong trường hợp này, quan trọng nhất sẽ là day, sau đó monthyear - ngược lại với những gì bạn đang tìm kiếm.

Điều bạn có thể thử làm là thay đổi Enum.sort_by(values, &(&1.day)) thành Enum.sort_by(values, &(Date.to_erl(&1.day))). Điều này sẽ chuyển đổi cấu trúc %Date{} thành bộ lọc Erlang sẽ được sắp xếp như mong đợi.

+0

đó đã làm việc tuyệt vời! Cảm ơn –

+0

Làm việc cho tôi, cảm ơn bạn! @ JaredKnipp bạn có thể đánh dấu đây là câu trả lời đúng không? – Mickey

0

bạn có thể sử dụng Calendar.Date.before quá:

Enum.sort(values, fn x, y -> Calendar.Date.before?(x.day, y.day) end) 

với Elixir.Date:

Enum.sort(values, fn x, y -> 
    case Date.compare(x.day, y.day) do 
    :lt -> true 
    _ -> false 
    end 
end) 
Các vấn đề liên quan