【问题标题】:Ruby sort array of arrays by subindex alphabeticallyRuby 按字母顺序按子索引对数组进行排序
【发布时间】:2018-06-05 04:45:44
【问题描述】:

我有一个数组数组:

arr_of_arrs = [
  ["cart", "disk", "halt", "walk"],
  ["prot", "waco", "beau", "drab"],
  ["meet", "lick", "look", "itch"],
  ["find", "asks", "noun", "keen"],
  ["jive", "moon", "seem", "beam"]
]

我如何按子数组指定索引处的元素的字母顺序对这个数组数组进行排序,比如索引 3,所以它的新顺序是:

[
  ["jive", "moon", "seem", "beam"],
  ["prot", "waco", "beau", "drab"],
  ["meet", "lick", "look", "itch"],
  ["find", "asks", "noun", "keen"],
  ["cart", "disk", "halt", "walk"]
] #                        ^^^^^^ index 3 is ordered

【问题讨论】:

  • 你有没有尝试过?
  • Enumerable#sort_by 是这里选择的方法,但如果排序索引为 3,您可以使用 Array#sort: arr.sort { |a,b| a[3] <=> b[3] }

标签: arrays ruby sorting


【解决方案1】:

如果索引是3,那么:

arr_of_arrs.sort_by{|a| a[3]}

【讨论】:

【解决方案2】:

这些问题询问如何通过单个索引对数组进行排序。正如其他人所展示的那样,我选择提供一个通用的解决方案来解决平局问题。

代码

def sort_by_index(arr, *idx_order)
  arr.sort_by { |a| a.values_at(*idx_order) }
end

示例

arr = [["cart", "disk", "halt", "walk"],
       ["prot", "waco", "beau", "drab"],
       ["meet", "disk", "seem", "beam"],
       ["find", "asks", "noun", "keen"],
       ["jive", "disk", "look", "beam"]]

请注意,arr 与 OP 示例中给出的数组不同。

按索引 1 排序

sort_by_index(arr, 1)
  #=> [["find", "asks", "noun", "keen"],
  #    ["cart", "disk", "halt", "walk"],
  #    ["meet", "disk", "seem", "beam"],
  #    ["jive", "disk", "look", "beam"],
  #    ["prot", "waco", "beau", "drab"]]

按索引 1 排序,与索引 3 断绝关系

sort_by_index(arr, 1, 3)
  #=> [["find", "asks", "noun", "keen"],
  #    ["meet", "disk", "seem", "beam"],
  #    ["jive", "disk", "look", "beam"],
  #    ["cart", "disk", "halt", "walk"],
  #    ["prot", "waco", "beau", "drab"]]

按索引 1 排序,与索引 3 断开关联,将前两个索引与索引 2 断开关联

sort_by_index(arr, 1, 3, 2)
  #=> [["find", "asks", "noun", "keen"],
  #    ["jive", "disk", "look", "beam"],
  #    ["meet", "disk", "seem", "beam"], 
  #    ["cart", "disk", "halt", "walk"],
  #    ["prot", "waco", "beau", "drab"]]

说明

考虑第二个例子,idx_order = [1, 3]。然后,在排序时,arr 的元素 a ("rows") 被比较

a.values_at(*idx_order) #=> a.values_at(1, 3)

比较arr的前两个元素(arr[0]arr[1])时,确定以下两个数组的顺序:

["cart","disk","halt","walk"].values_at(1, 3) #=> ["disk", "walk"]
["prot","waco","beau","drab"].values_at(1, 3) #=> ["waco", "drab"]

Array#<=> 方法用于确定这两个 2 元素数组的顺序。 (特别是文档的第三段,它解释了如何“逐元素”比较数组。)

自从

"disk" <=> "waco" #=> -1

arr[0] 在排序顺序中位于arr[1] 之前。

现在假设我们比较 arr[0]arr[2]

["cart","disk","halt","walk"].values_at(1, 3) #=> ["disk", "walk"]
["meet","disk","seem","beam"].values_at(1, 3) #=> ["disk", "beam"]

由于这两个 2 元素数组在索引 0 处都有 "disk",因此我们必须比较 "walk""beam" 以确定决胜局:

["disk", "walk"] <=> ["disk", "beam"] #=> 1

这告诉我们arr[2] 在排序顺序中位于arr[0] 之前。

【讨论】:

  • 感谢您的进一步解释。
【解决方案3】:

按第四个元素(即索引 3)排序:

arr_of_arrs.sort_by { |a| a[3] }

或:

index = ->(i) { ->(a) { a[i] } }
arr_of_arrs.sort_by(&index[3])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-28
    • 2010-12-12
    • 1970-01-01
    • 2019-06-15
    • 1970-01-01
    相关资源
    最近更新 更多