有两个阵列:
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 }
但它不起作用。
这个问题与可能的重复有所不同,因为它处理相应数组中元素的存在,并且此处不存在哈希。
答案 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) }