我有三个阵列。
我的主要列表包含在数据库中验证的不同实体的混合:
ab = ["a:555", "b:222", "a:333", "b:777", "a:777", "a:999", "b:111"]
我还有两个a
和b
个实体的数组分开,但是有序(有些丢失了):
# notice that some of the items from the initial list are missing, but the order is preserved!
a = [{id}, "a:777", "a:999"]
b = ["b:222", "b:111"]
在数组a
中合并b
和c
的有效方法是什么,以保留项目所在的ab
中的顺序?我对该程序的预期结果是:
c = ["a:555", "b:222", "a:777", "a:999", "b:111"]
我是一个Ruby新手,我提出的所有内容都非常难看。
编辑:
我确实知道这很重要,但会让人感到困惑,但a
和b
是代表ab
中字符串的复杂对象(AR)。用我的代码澄清:
ab = ["a:555", "b:222", "a:333", "b:777", "a:777", "a:999", "b:111"]
a = [{:id => 555}, {:id => 777}, {:id => 999}]
b = [{:id => 222}, {:id => 111}]
c = []
ab.each { |item|
parts = item.split(":")
if parts[0] == "a"
if a[0][:id].to_s() == parts[1]
c << a.shift()
end
else
if b[0][:id].to_s() == parts[1]
c << b.shift()
end
end
}
puts c
答案 0 :(得分:3)
如果a和b之间的值id
不明显,则可以执行此操作
c = (
a.map { |e| [ "a:#{e[:id]}", e ] } +
b.map { |e| [ "b:#{e[:id]}", e ] }
).
sort_by { |e| ab.index(e.first) }.
map(&:last)
由于您现在声明它们是不同的,并且在生成您的ab键的对象上有一个方法,这更简单:
c = (a + b).sort_by { |e| ab.index(e.get_ab_string) }
ab.index
是对ab的O(N)运算,因此它将通常为NlnN的排序升级为N ^ 2。要将整个解决方案带回O(NlnN)运行时,可以将ab的索引预先计算为哈希(O(N)操作,允许在sort_by中进行O(1)查找):
ab_idx = Hash[ ab.map.with_index { |e,i| [e, i] } ]
c = (a + b).sort_by { |e| ab_idx(e.get_ab_string) }
答案 1 :(得分:0)
以下是如何将数组排序为与另一个相同的顺序的基础。从两个数组开始:
ary_a = %w[one four three two]
ary_b = [1, 4, 3, 2]
合并它们,排序,然后检索我们想要分类的那个:
ary_a.zip(ary_b).sort_by{ |a, b| b }.map(&:first)
=> ["one", "two", "three", "four"]
如果我们想要撤销订单:
ary_a.zip(ary_b).sort_by{ |a, b| -b }.map(&:first)
=> ["four", "three", "two", "one"]
或:
ary_a.zip(ary_b).sort_by{ |a, b| b }.map(&:first).reverse
=> ["four", "three", "two", "one"]
如果有三个阵列,则需要与第三个阵列一起订购:
ary_c = %w[a-one a-four a-three a-two]
ary_a.zip(ary_c).zip(ary_b).sort_by{ |a, b| b }.map(&:first)
=> [["one", "a-one"], ["two", "a-two"], ["three", "a-three"], ["four", "a-four"]]
在合并和排序之前将数组放入所需的表单是个问题。一旦你拥有了它们,并且它们具有相同数量的元素,那么这是一个非常简单的模式。