Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 按日期对数组元素排序_Ruby_Arrays_Sorting_Date - Fatal编程技术网

Ruby 按日期对数组元素排序

Ruby 按日期对数组元素排序,ruby,arrays,sorting,date,Ruby,Arrays,Sorting,Date,我有以下数组 dates = ["6/23/2014", "8/5/2014", "8/19/2014", "6/26/2014", "8/19/2014", "8/19/2014", "7/8/2014", "6/3/2014", "7/30/2014", "7/3/2014", "6/3/2014", "6/26/2014"] 我们的数组存储10个字符串对象。为了按我的方式对它们进行排序,我需要重新安排每个元素 "2014/8/5", "2014/8/19", "2014/8/19", e

我有以下数组

dates = ["6/23/2014", "8/5/2014", "8/19/2014", "6/26/2014", "8/19/2014", "8/19/2014",
"7/8/2014", "6/3/2014", "7/30/2014", "7/3/2014", "6/3/2014", "6/26/2014"]
我们的数组存储10个字符串对象。为了按我的方式对它们进行排序,我需要重新安排每个元素

"2014/8/5", "2014/8/19", "2014/8/19", etc.
这样,2014年1月1日就不会在1994年12月13日之前出现

我尝试了以下方法

dates.sort_by {|date|date.split(/[\/]/).rotate(-1).join('/')}
我想按日期对这个数组排序,首先是最新的日期

实际产出

8/5/2014
8/19/2014
8/19/2014
8/19/2014
7/8/2014
7/30/2014
7/3/2014
6/3/2014
6/3/2014
6/26/2014
8/19/2014
8/19/2014
8/19/2014
8/5/2014
7/30/2014
7/3/2014
6/26/2014
6/3/2014
6/3/2014
预期产出

8/5/2014
8/19/2014
8/19/2014
8/19/2014
7/8/2014
7/30/2014
7/3/2014
6/3/2014
6/3/2014
6/26/2014
8/19/2014
8/19/2014
8/19/2014
8/5/2014
7/30/2014
7/3/2014
6/26/2014
6/3/2014
6/3/2014
解决方案包括利用Ruby数组类sort_by方法。我想用日期格式排序,新的日期在较早的日期之前

我的问题是,如何根据日期对数组进行排序

我很抱歉,如果这是一个愚蠢的问题,但我已经搜索了这个网站,没有找到任何结果

提前感谢您的帮助。

请尝试:

dates.sort_by { |s| Date.strptime(s, '%m/%d/%Y') }
如果您希望从最新日期开始:

dates.sort_by { |s| Date.strptime(s, '%m/%d/%Y') }.reverse

我不知道为什么您的预期输出只包含12个条目中的9个,并且您提到了大小为10的数组,但我相信您希望对所有12个条目进行排序。我的偏好是按照@BroiSatse的方式来做,但我将提供两种不使用类
Date
中的方法的方法。我之所以把它们包括进来,是因为对于那些刚接触Ruby的人来说,它有一些有趣的方面

dates = [
  "6/23/2014", "8/5/2014", "8/19/2014", "6/26/2014", "8/19/2014", "10/19/2014",
  "7/8/2014", "6/3/2014", "7/30/2014", "7/3/2014", "6/3/2014", "6/26/2014"
]
我稍微更改了日期,使其包含两位数的月份(
“10/19/2014”

按整数数组排序

dates.sort_by { |d| d.split(?/).rotate(-1).map { |e| -e.to_i } }
  #=> ["10/19/2014", "8/19/2014", "8/19/2014", "8/5/2014", "7/30/2014", "7/8/2014",
  #    "7/3/2014", "6/26/2014", "6/26/2014", "6/23/2014", "6/3/2014", "6/3/2014"]
下面是正在发生的事情

enum = dates.sort_by
  #=> #<Enumerator: [
  #     "6/23/2014", "8/5/2014", "8/19/2014", "6/26/2014", "8/19/2014", "10/19/2014",
  #     "7/8/2014", "6/3/2014", "7/30/2014", "7/3/2014", "6/3/2014", "6/26/2014"
  #   ]:sort_by>
类似地,
enum
的第三个元素被转换为:

"8/19/2014".split(?/).rotate(-1).map { |e| -e.to_i }
  #=> [-2014, -8, -19]
sort\u by
用于比较元素对。阅读该文件后,您将了解原因:

[-2014, -6, -23] <=> [-2014, -8, -19]
  #=> 1
注意

arr = dates.map do |d|
  d.sub(/(\d+)\/(\d+)\/(\d+)/) { "%4d%02d%02d" % [$3, $1, $2].map(&:to_i) }
end
  #=> ["20140623", "20140805", "20140819", "20140626", "20140819", "20141019",
  #    "20140708", "20140603", "20140730", "20140703", "20140603", "20140626"]
有关格式化指令,请参阅。看来
.map(&:to_i)
实际上是不必要的;当使用
d
指令时,Ruby将表示整数的字符串处理为整数

正则表达式
/(\d+)\/(\d+)\/(\d+)/
匹配保存到捕获组1的一个或多个数字(月份),后跟保存到捕获组2的一个或多个数字(日期),后跟保存到捕获组3的一个或多个数字(年份)。你也可以这样写:

/(\d{1,2})\/(\d{1,2})\/(\d{4})/
或使用命名的捕获组:

r = /(?<month>\d{1,2})\/(?<day>\d{1,2})\/(?<year>\d{4})/

dates.sort_by do |d|
  d.sub(r) { "%4d%02d%02d" % [$~[:year], $~[:month], $~[:day]].map(&:to_i) }
end.reverse
  #=> ["10/19/2014", "8/19/2014", "8/19/2014", "8/5/2014", "7/30/2014", "7/8/2014",
  #    "7/3/2014", "6/26/2014", "6/26/2014", "6/23/2014", "6/3/2014", "6/3/2014"]
r=/(?\d{1,2})\/(?\d{1,2})\/(?\d{4})/
dates.sort|u by do|d|
d、 sub(r){“%4d%02d%02d”%[$~[:年],$~[:月],$~[:日]].映射(&:to_i)}
倒
#=> ["10/19/2014", "8/19/2014", "8/19/2014", "8/5/2014", "7/30/2014", "7/8/2014",
#    "7/3/2014", "6/26/2014", "6/26/2014", "6/23/2014", "6/3/2014", "6/3/2014"]
$~
是最新版本。它等于

r = /(?<month>\d{1,2})\/(?<day>\d{1,2})\/(?<year>\d{4})/

dates.sort_by do |d|
  d.sub(r) { "%4d%02d%02d" % [$~[:year], $~[:month], $~[:day]].map(&:to_i) }
end.reverse
  #=> ["10/19/2014", "8/19/2014", "8/19/2014", "8/5/2014", "7/30/2014", "7/8/2014",
  #    "7/3/2014", "6/26/2014", "6/26/2014", "6/23/2014", "6/3/2014", "6/3/2014"]