如何使用Ruby基于另一个数组对一个数组进行排序

时间:2016-06-23 11:58:55

标签: arrays ruby sorting

有两个阵列:

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 }

但它不起作用。

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

3 个答案:

答案 0 :(得分:7)

完美无缺:

▶ 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 }

答案 1 :(得分:2)

首先考虑B的每个元素都位于A的情况,与问题的示例一样:

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

可以编写以下内容,只需要通过A(构建g 1 )并通过B进行单次传递。 / p>

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中,并且任何非元素都不在放置在已排序数组的末尾,则可以更改{{1}的计算1}}稍微。

g

这需要再通过A和通过B。

例如,假设

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

A = [2,3,4,6,7,8,9] 保持不变。然后,

B

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

1我希望有人可以写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] ,但文档Array#to_h并不能保证返回的哈希中的键与g = A.product([1]).to_h中的键具有相同的顺序

答案 2 :(得分:0)

我首先要检查A中存在哪些B元素:

B & A

然后对其进行排序:

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