首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ruby重新排序日期数组,字符串部分保留空字符串

ruby重新排序日期数组,字符串部分保留空字符串
EN

Stack Overflow用户
提问于 2019-06-14 22:53:09
回答 2查看 1K关注 0票数 1

我有一个包含空字符串的日期数组,我想用两种方式重新排序,每种情况下,空字符串应该总是在数组的前面。

代码语言:javascript
复制
[" ", "2018-10-01", "2019", " ",  "2019-06-20", "2019-06", "2019-10", "2019-01-01", "2017", "2018-05", "2018", "2018-05-10",  " "]

第一个结果是用这种方式重新排序。

代码语言:javascript
复制
["", "", "", "2019-10-01", "2019-10", "2019-06-20", "2019-06", "2019", "2018-01-01", "2018-05", "2018-05-10", "2017"]

第二种方式,我想要这样重新订购:

代码语言:javascript
复制
[" ", " ", " ", "2017", "2018-01-01", "2019-06-20", "2019-06", "2019-10-01", "2019-10", "2019"]

我尝试了下面的代码,但没有得到预期的结果。

代码语言:javascript
复制
  ["", "", "", "2019-10-01", "2019-10", "2019-06-20", "2019-06", "2019", "2018-01-01", "2018-05", "2018-05-10", "2017"].sort_by { |date| parts = date.split('-').map(&:to_i) }

更新

提升的排序是否有可能以这个顺序出现。yy,yy,然后仅仅是年份,这意味着排序升序应该以[" ", " ", " ", "2017","2018-05-10", "2018-05", "2018-10-01", "2018", "2019-01-01", "2019-06-20", "2019-06", "2019-10", "2019"]的形式出现。因此,它不是一个上升的规则排序,而是基于导致上述顺序的模式。

同样的模式适用于排序降序。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-06-15 00:53:22

解决方案1-正常排序

您可以根据字符串是否为空这一事实,首先对列表进行分区。然后对现在的日期进行排序,并将它们连在一起。

代码语言:javascript
复制
dates = [" ", "2018-10-01", "2019", " ",  "2019-06-20", "2019-06", "2019-10", "2019-01-01", "2017", "2018-05", "2018", "2018-05-10",  " "]

asc = ->(a, b) { a <=> b }
desc = ->(a, b) { b <=> a }

blank, present = dates.partition(&:blank?)
result1 = blank + present.sort(&desc)
#=> [" ", " ", " ", "2019-10", "2019-06-20", "2019-06", "2019-01-01", "2019", "2018-10-01", "2018-05-10", "2018-05", "2018", "2017"]
result2 = blank + present.sort(&asc)
#=> [" ", " ", " ", "2017", "2018", "2018-05", "2018-05-10", "2018-10-01", "2019", "2019-01-01", "2019-06", "2019-06-20", "2019-10"]

备注:,这只是根据字母顺序对数组进行排序。只要您使用的是yyyy-mm-dd格式(如果只有一位数,则使用零运算),这是很好的。如果日期是以另一种格式提供的,则首先要将其转换为日期。

解决方案2-假定丢失月或日的最高值

代码语言:javascript
复制
strings = [" ", "2018-10-01", "2019", " ",  "2019-06-20", "2019-06", "2019-10", "2019-01-01", "2017", "2018-05", "2018", "2018-05-10",  " "]

array_to_date = lambda do |(year, month, day)|
  month ||= 12
  day ||= 31

  begin
    Date.new(year, month, day)
  rescue ArgumentError
    raise unless (1..12).cover? month
    raise unless (1..31).cover? day
    array_to_date.call([year, month, day - 1])
  end
end

date_regex = /\A(\d{4})(?:-(\d{2})(?:-(\d{2}))?)?\z/
yyyy_mm_dd = ->(date_string) { date_regex.match(date_string).captures.compact.map(&:to_i) }
string_to_date = yyyy_mm_dd >> array_to_date

asc = ->(a, b) { string_to_date.call(a) <=> string_to_date.call(b) }
desc = ->(a, b) { string_to_date.call(b) <=> string_to_date.call(a) }

dates, non_dates = strings.partition(&date_regex.method(:match?))
result1 = non_dates + dates.sort(&desc)
#=> [" ", " ", " ", "2019", "2019-10", "2019-06", "2019-06-20", "2019-01-01", "2018", "2018-10-01", "2018-05", "2018-05-10", "2017"]
result2 = non_dates + dates.sort(&asc)
#=> [" ", " ", " ", "2017", "2018-05-10", "2018-05", "2018-10-01", "2018", "2019-01-01", "2019-06-20", "2019-06", "2019-10", "2019"]

注释:--这不是最有效的解决方案,因为每次调用#sort块时都必须转换字符串。如果您正在处理大型数组,您可以首先转换所有的值并将它们保存在一个散列中。整理的时候查一下。

当前正则表达式还允许像"0000-00-00"这样的字符串传递,您可能希望使它更加具体。

票数 2
EN

Stack Overflow用户

发布于 2019-06-15 00:28:58

代码语言:javascript
复制
arr = [" ", "2018-10-01", "2019", " ",  "2019-06-20", "2019-06", "2019-10",
       "2019-01-01", "2017", "2018-05", "2018", "2018-05-10",  " "]

上升的类型:

代码语言:javascript
复制
def sort_asc(arr)
  arr.sort
end

代码语言:javascript
复制
sort_asc(arr)
  #=> [" ", " ", " ",
  #    "2017",
  #    "2018", "2018-05", "2018-05-10", "2018-10-01",
  #    "2019", "2019-01-01", "2019-06", "2019-06-20", "2019-10"]

下降的那一类:

代码语言:javascript
复制
def sort_dsc(arr)
  arr.sort_by { |s| s == ' ' ? '99' : s }.reverse
end

代码语言:javascript
复制
sort_dsc(arr)
  #=> [" ", " ", " ",
  #    "2019-10", "2019-06-20", "2019-06", "2019-01-01", "2019",
  #    "2018-10-01", "2018-05-10", "2018-05", "2018",
  #    "2017"]
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56605945

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档