加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby – 按降序排序字符串的方法(在复杂键中)

发布时间:2020-12-17 02:49:11 所属栏目:百科 来源:网络整理
导读:为了对字符串数组a进行下行排序,可以使用反向. a.sort.reverse 但是当你想在多个排序键中使用一个字符串时,就无法做到这一点.假设items是具有属性attr1(String),attr2(String),attr3(Integer)的项的数组.排序可以像: items.sort_by{|item| [item.attr1,item
为了对字符串数组a进行下行排序,可以使用反向.

a.sort.reverse

但是当你想在多个排序键中使用一个字符串时,就无法做到这一点.假设items是具有属性attr1(String),attr2(String),attr3(Integer)的项的数组.排序可以像:

items.sort_by{|item| [item.attr1,item.attr2,item.attr3]}

从上升到下降可以通过将其乘以-1来独立地为Integer完成:

items.sort_by{|item| [item.attr1,-item.attr3]}

但是这种方法对于String来说并不简单.可以定义这样的方法吗?当你想对attr2进行降序排序时,它应该写成:

items.sort_by{|item| [item.attr1,item.attr2.some_method,item.attr3]}

解决方法

我认为你总是可以将你的字符串转换为整数数组(ord).像这样:

strings = [["Hello","world"],["Hello","kitty"],"darling"]]
strings.sort_by do |s1,s2|
  [
    s1,s2.chars.map(&:ord).map{ |n| -n }
  ]
end

PS:

正如@CarySwoveland在这里发现的是一个带有空字符串的角落案例,这可以通过这个非优雅的解决方案来解决:

strings.sort_by do |s1,s2.chars.
       map(&:ord).
       tap{|chars| chars << -Float::INFINITY if chars.empty? }.
       map{ |n| -n }
  ]
end

@Jordan很友好地提到sort_by使用Schwartzian Transform所以你根本不需要预处理.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读