2017-01-14 13 views
6

में तिथियों की छंटनी सूची मैंने चोट की वसूली प्रक्रिया में मेरी मदद करने के लिए एक छोटी सी लिपि रखी। यह मेरी अपेक्षाओं को आउटपुट करता है, हालांकि तारीखों को क्रमबद्ध करने के लिए प्रतीत नहीं होता है - ऐसा लगता है कि महीने/दिन के अनुसार क्रमबद्ध करना काम कर रहा है, लेकिन साल तक नहीं। वही परिणाम अगर मैं केवल तारीखों की एक सूची क्रमबद्ध कर रहा हूं और संरचना का उपयोग नहीं कर रहा हूं।एलिक्सीर

साइड नोट, https://github.com/lau/calendar का उपयोग करके मेरी तिथि सीमा को पॉप्युलेट करें।

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 

आईईएक्स में चल रहा है आउटपुट निम्नलिखित: इस तरह

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}] 

उत्तर

9

यह पुस्तकालय से तारीख struct की तरह लगता है आप उपयोग कर रहे दिखता है: %Date{day: 25, month: 12, year: 2014}। एलिक्सीर structs में क्षेत्रों की वर्णानुक्रम में, उनकी सामग्री से तुलना की जाती है। इस मामले में सबसे महत्वपूर्ण day होगा, फिर month और year - जो आप खोज रहे हैं उसके विपरीत।

आप क्या कर सकते हैं Enum.sort_by(values, &(&1.day)) से Enum.sort_by(values, &(Date.to_erl(&1.day))) बदल रहा है। यह %Date{} संरचना को एरलांग टुपल में परिवर्तित करेगा जिसे अपेक्षित के रूप में क्रमबद्ध किया जाना चाहिए।

+0

कि महान काम किया! धन्यवाद –

+0

मेरे लिए काम करता है, धन्यवाद! @JaredKnipp क्या आप इसे सही उत्तर के रूप में चिह्नित कर सकते हैं? – Mickey

0

आप Calendar.Date.before भी उपयोग कर सकते हैं:

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

Elixir.Date साथ:

Enum.sort(values, fn x, y -> 
    case Date.compare(x.day, y.day) do 
    :lt -> true 
    _ -> false 
    end 
end) 
संबंधित मुद्दे