在ruby中,如何按日期排序数组中的行?

时间:2015-11-17 20:44:55

标签: ruby

在以下输出中,每行包含一个日期,它是无序的。如何按日期订购每一行?请注意,列表位于数组中。

Wilkinson Stacy NYC 1/22/1964 Shocking Pink
Bednar Filomena New York City 1/24/1980 Salmon
Goyette Timmothy London 10/2/1964 Pacific Blue
Nolan Rhiannon LA 10/4/1974 Vivid Tangerine
Bruen Rigoberto SF 12/1/1962 Raw Umber
Parker Matteo Melbourne 2/14/1962 Burnt Sienna
Cummerata Elliot New York City 4/3/1947 Neon Carrot
Kirlin Mckayla Atlanta 5/29/1986 Maroon
Barrows Anika Hong Kong 5/5/1965 Spring Green

3 个答案:

答案 0 :(得分:3)

arr = <<-BITTER_END.split("\n")
Wilkinson Stacy NYC 1/22/1964 Shocking Pink
Bednar Filomena New York City 1/24/1980 Salmon
Goyette Timmothy London 10/2/1964 Pacific Blue
Nolan Rhiannon LA 10/4/1974 Vivid Tangerine
Bruen Rigoberto SF 12/1/1962 Raw Umber
Parker Matteo Melbourne 2/14/1962 Burnt Sienna
Cummerata Elliot New York City 4/3/1947 Neon Carrot
Kirlin Mckayla Atlanta 5/29/1986 Maroon
Barrows Anika Hong Kong 5/5/1965 Spring Green
BITTER_END

require 'date'
arr.sort_by { |line| Date.strptime(line[/\d\d?\/\d\d?\/\d{4}/], '%m/%d/%Y') }
  #=> ["Cummerata Elliot New York City 4/3/1947 Neon Carrot",
  #    "Parker Matteo Melbourne 2/14/1962 Burnt Sienna",
  #    "Bruen Rigoberto SF 12/1/1962 Raw Umber",
  #    "Wilkinson Stacy NYC 1/22/1964 Shocking Pink",
  #    "Goyette Timmothy London 10/2/1964 Pacific Blue",
  #    "Barrows Anika Hong Kong 5/5/1965 Spring Green",
  #    "Nolan Rhiannon LA 10/4/1974 Vivid Tangerine",
  #    "Bednar Filomena New York City 1/24/1980 Salmon",
  #    "Kirlin Mckayla Atlanta 5/29/1986 Maroon"] 

正如@xlembouras指出的那样,如果需要,可以使用.join("\n")将数组返回给字符串。

答案 1 :(得分:2)

最好的方法是将它们全部转换为日期对象然后排序。

这些日期的最大问题是它们采用美国格式,如果格式为$("#nav_mobile").html($("#nav_main").html()); $("#menu_button span").click(function(){ if ($("#nav_mobile ul").hasClass("expanded")) { $("#nav_mobile ul.expanded").removeClass("expanded").slideUp(250); $(this).removeClass("open"); } else { $("#nav_mobile ul").addClass("expanded").slideDown(250); $(this).addClass("open"); } }); <div id="menu_button"> <span>Menu</span> </div> <nav id="nav_main"> <ul> <li><a href="#">1. Link</a></li> <li><a href="#">2. Link</a></li> <li><a href="#">3. Link</a></li> <li><a href="#">4. Link</a></li> </ul> </nav> <nav id="nav_mobile"></nav> ,那么您必须使用day/month/year

Date.strptime

修改

看起来你编辑了你的问题。如果您尝试按日期内的日期对行进行排序,则需要使用require 'date' dates = ['1/22/1964' ,'1/24/1980' ,'10/2/1964' ,'10/4/1974' ,'12/1/1962' ,'2/14/1962' ,'4/3/1947' ,'5/29/1986' ,'5/5/1965'] dates = dates.collect {|date| Date.strptime(date, "%m/%d/%Y")}.sort #if you want them to go back to the same format dates.collect {|date| date.strftime("%-m/%-d/%Y") }

如果您有一个如下所示的数组:

sort_by

然后您可以按日期对这些行进行排序:

array = [
  "Wilkinson Stacy NYC 1/22/1964 Shocking Pink",
  "Bednar Filomena New York City 1/24/1980 Salmon",
  "Goyette Timmothy London 10/2/1964 Pacific Blue",
  "Nolan Rhiannon LA 10/4/1974 Vivid Tangerine",
  "Bruen Rigoberto SF 12/1/1962 Raw Umber",
  "Parker Matteo Melbourne 2/14/1962 Burnt Sienna",
  "Cummerata Elliot New York City 4/3/1947 Neon Carrot",
  "Kirlin Mckayla Atlanta 5/29/1986 Maroon",
  "Barrows Anika Hong Kong 5/5/1965 Spring Green",
]

答案 2 :(得分:0)

如果您有dates数组,例如

dates = ['1/22/1964' ,'1/24/1980' ,'10/2/1964' ,'10/4/1974' ,'12/1/1962' ,'2/14/1962' ,'4/3/1947' ,'5/29/1986' ,'5/5/1965']

您可以使用Enumerable#sort_by

对其进行排序
require 'date'

dates = ['1/22/1964' ,'1/24/1980' ,'10/2/1964' ,'10/4/1974' ,'12/1/1962',
         '2/14/1962' ,'4/3/1947' ,'5/29/1986' ,'5/5/1965']

dates.sort_by { |x| Date.strptime(x, "%m/%d/%Y") }
#=> ["4/3/1947", "2/14/1962", "12/1/1962", "1/22/1964", "10/2/1964", "5/5/1965", "10/4/1974", "1/24/1980", "5/29/1986"]

根本没有弄乱初始数组。

如果您想要反向订购,可以在最后添加.reverse