Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.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_Date - Fatal编程技术网

使用ruby从日期列表创建日期范围数组

使用ruby从日期列表创建日期范围数组,ruby,arrays,date,Ruby,Arrays,Date,使用日期列表中的日期范围创建哈希数组的最佳方法是什么。例如:如果我有一个数组中的日期列表,如下所示: ['12/11/2014','13/11/2014','14/11/2014','24/11/2014','25/11/2014','26/11/2014','27/11/2014','28/11/2014','29/11/2014','04/12/2014','05/12/2014','06/12/2014','07/12/2014','24/12/2014','25/12/2014','2

使用日期列表中的日期范围创建哈希数组的最佳方法是什么。例如:如果我有一个数组中的日期列表,如下所示:


['12/11/2014','13/11/2014','14/11/2014','24/11/2014','25/11/2014','26/11/2014','27/11/2014','28/11/2014','29/11/2014','04/12/2014','05/12/2014','06/12/2014','07/12/2014','24/12/2014','25/12/2014','26/12/2014', '28/12/2014', '30/12/2014']

我正在尝试获取日期范围散列数组,如下所示:


[{:from=>'12/11/2014',:to=>'14/11/2014',{:from=>'24/11/2014',:to=>'29/11/2014',{:from=>'04/12/2014',:to=>'07/12/2014',{:from=>'24/12/2014',:to=>'26/12/1014',{:from=>'28/12/2014',:to=>'28/12/2014',{:from=>'30/12/2014']


Ruby中有什么可以生成这样的东西吗?谢谢。

Enumerable有
slice\u before
方法,它可以做你想做的事情,还添加了一些代码。这是来自:

如果块需要在多个元素上保持状态,则可以使用局部变量。例如,可以按如下方式压缩三个或更多连续递增的数字:

a=[0,2,3,4,6,7,9]
prev=a[0]
p a.在{e |之前切|
prev,prev2=e,prev
prev2+1!=e
}.map{| es|
es.长度“0,2-4,6,7,9”

显然这不是完整的答案,但我不在我的计算机上,它的代码可以完全满足您的需要。

Enumerable有
slice\u before
方法,可以满足您的需要,并添加了一些代码。这是来自:

require 'date'

array = ['12/11/2014','13/11/2014','14/11/2014','24/11/2014','25/11/2014','26/11/2014','27/11/2014','28/11/2014','29/11/2014','04/12/2014','05/12/2014','06/12/2014','07/12/2014','24/12/2014','25/12/2014','26/12/2014', '28/12/2014', '30/12/2014']

dates = array.map { |datestr| [datestr, Date.parse(datestr)] }
prev = nil
ranges = dates.slice_before { |datestr, date|
  ((prev ? date - prev : 1) != 1).tap { prev = date }
}.map { |dates|
  { from: dates[0][0], to: dates[-1][0] }
}
如果块需要在多个元素上保持状态,则可以使用局部变量。例如,可以按如下方式压缩三个或更多连续递增的数字:

a=[0,2,3,4,6,7,9]
prev=a[0]
p a.在{e |之前切|
prev,prev2=e,prev
prev2+1!=e
}.map{| es|
es.长度“0,2-4,6,7,9”
很明显,这不是完整的答案,但我不在我的电脑前,因为我的电脑里有代码,可以做你想要的事情

require 'date'

array = ['12/11/2014','13/11/2014','14/11/2014','24/11/2014','25/11/2014','26/11/2014','27/11/2014','28/11/2014','29/11/2014','04/12/2014','05/12/2014','06/12/2014','07/12/2014','24/12/2014','25/12/2014','26/12/2014', '28/12/2014', '30/12/2014']

dates = array.map { |datestr| [datestr, Date.parse(datestr)] }
prev = nil
ranges = dates.slice_before { |datestr, date|
  ((prev ? date - prev : 1) != 1).tap { prev = date }
}.map { |dates|
  { from: dates[0][0], to: dates[-1][0] }
}
这比需要的要复杂一些,因为您使用的是日期字符串而不是日期。此外,使用
Range
对象数组可能比散列数组更好:

dates = array.map(&Date.method(:parse))
prev = nil
pp dates.slice_before { |date|
  ((prev ? date - prev : 1) != 1).tap { prev = date }
}.map { |dates| dates[0]..dates[-1] }
这比需要的要复杂一些,因为您使用的是日期字符串而不是日期。此外,使用
Range
对象数组可能比散列数组更好:

dates = array.map(&Date.method(:parse))
prev = nil
pp dates.slice_before { |date|
  ((prev ? date - prev : 1) != 1).tap { prev = date }
}.map { |dates| dates[0]..dates[-1] }

一种方法是使用枚举器。假设您有一个数组:

a = %w[a b d e f i k l m n o t]
  #=> ["a", "b", "d", "e", "f", "i", "k", "l", "m", "n", "o", "t"]
然后

arr=[[a.first]]
enum=a[1..-1]。到_enum
环道
e=enum.next
最后的
如果last.last.such==e

最后一种方法是使用枚举器。假设您有一个数组:

a = %w[a b d e f i k l m n o t]
  #=> ["a", "b", "d", "e", "f", "i", "k", "l", "m", "n", "o", "t"]
然后

arr=[[a.first]]
enum=a[1..-1]。到_enum
环道
e=enum.next
最后的
如果last.last.such==e

最后,您按照什么模式从
到数组中获取日期?您按照什么模式从和到数组中获取日期?