【问题标题】:How to sort one array based on another array using Ruby如何使用 Ruby 基于另一个数组对一个数组进行排序
【发布时间】:2016-06-23 11:58:54
【问题描述】:

有两个数组:

A = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 
B = [3, 4, 1, 5, 2, 6]

我想对B 进行排序,对于B 中存在于A 中的所有元素,按照数组A 中的顺序对元素进行排序。

想要的排序结果是

B #=> [1, 2, 3, 4, 5, 6]

我已经尝试过了

B = B.sort_by { |x| A.index }

但它不起作用。

这个问题与可能的重复问题不同,因为它处理相应数组中元素的存在,并且这里不存在哈希值。

【问题讨论】:

标签: arrays ruby sorting


【解决方案1】:

效果很好:

▶ A = [1,3,2,6,4,5,7,8,9,10]
▶ B = [3,4,1,5,2,6]
▶ B.sort_by &A.method(:index)
#⇒ [1, 3, 2, 6, 4, 5]

如果B 中可能存在A 中不存在的元素,请使用:

▶ B.sort_by { |e| A.index(e) || Float::INFINITY }

【讨论】:

  • 看起来没有必要像我在回答中那样做检查:) 好答案。
  • 虽然 B 中不属于 A 的元素会失败。尝试从 A 中删除元素 3
  • 完美运行!谢谢
  • 一直有效,直到 A 中没有 B 中的元素。
  • @radubogdan 不错,已更新。我认为你放弃 A 元素中不存在的决定是不行的。
【解决方案2】:

我会首先检查 B 中的哪些元素存在于 A 中:

B & A

然后排序:

(B & A).sort_by { |e| A.index(e) }

【讨论】:

    【解决方案3】:

    首先考虑B的每个元素都在A中的情况,如问题示例:

    A = [1,2,3,4,5,6,7,8,9,10]
    B = [3,6,1,5,1,2,1,6]
    

    可以编写以下代码,只需要一次通过A(构造g1)和一次通过B

    g = A.each_with_object({}) { |n,h| h[n] = 1 }
      #=> {1=>1, 2=>1, 3=>1, 4=>1, 5=>1, 6=>1, 7=>1, 8=>1, 9=>1, 10=>1}
    B.each_with_object(g) { |n,h| h[n] += 1 }.flat_map { |k,v| [k]*(v-1) }
      #=> [1, 1, 1, 2, 3, 5, 6, 6]
    

    如果不能保证B 的所有元素都在A 中,并且任何没有的元素都放在排序数组的末尾,可以稍微改变g 的计算。

    g = (A + (B-A)).each_with_object({}) { |n,h| h[n] = 1 }
    

    这需要再通过 A 和 B。

    假设,例如,

    A = [2,3,4,6,7,8,9]
    

    B 不变。那么,

    g = (A + (B-A)).each_with_object({}) { |n,h| h[n] = 1 }
      #=> {2=>1, 3=>1, 4=>1, 6=>1, 7=>1, 8=>1, 9=>1, 1=>1, 5=>1}
    B.each_with_object(g) { |n,h| h[n] += 1 }.flat_map { |k,v| [k]*(v-1) }
      #=> [2, 3, 6, 6, 1, 1, 1, 5]
    

    此解决方案展示了在 Ruby v1.9 中对哈希属性进行的有争议更改的价值:此后哈希将保证保持键插入顺序。

    1 我希望可以写g = A.product([1]).to_h,但文档Array#to_h 不保证返回的哈希中的键与A 中的键具有相同的顺序。

    【讨论】:

    • 如果B的每一个元素都在A中,这个方案绝对是最优雅的。
    • @mudasobwa,我做了一些您可能感兴趣的更改。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-27
    相关资源
    最近更新 更多