0

私は3つの配列を持っています。

私のメイン リストには、DB で検証されるさまざまなエンティティが混在しています。

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? 手順からの私の期待される結果は次のとおりです。cab

c = ["a:555", "b:222", "a:777", "a:999", "b:111"]

私は Ruby の初心者で、思いついたものはすべてまったく醜いものです。


編集:

a私はそれが重要であることを知っていbましたab. 私のコードで明確にするには:

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
4

2 に答える 2

3

idが a と b の間で区別されない場合、これを行うことができます

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.indexab に対する O(N) 操作であるため、通常は NlnN ソートを N^2 にエスカレートします。ソリューション全体を O(NlnN) ランタイムに戻すには、ab のインデックスをハッシュに事前計算できます (sort_by で O(1) ルックアップを許可する O(N) 操作)。

ab_idx = Hash[ ab.map.with_index { |e,i| [e, i] } ]
c = (a + b).sort_by { |e| ab_idx(e.get_ab_string) }
于 2013-05-09T10:37:20.520 に答える
0

配列を別の配列と同じ順序にソートする方法の基本は次のとおりです。2 つの配列から始めます。

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"]

3 つのアレイがあり、2 つを 3 つ目のアレイと合わせて注文する必要がある場合:

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"]]

マージとソートの前に必要な形式に配列を取得することが問題です。それらを取得し、要素の数が同じであれば、それは非常に単純なパターンです。

于 2013-05-09T14:03:53.570 に答える