0

文字列の配列が2つあります

order_items=["2832","3284","9832","9234"]
uri=["orderaccept/order_items/3284/cancel","orderaccept/order_items/9234/cancel"]

order_itemsの一部ではなかったすべての要素を見つけたいuri。この場合、とを返す必要が2832あり9832ます。

両方の配列の内容を自由に編集してください。同様の質問は見つかりませんでしたが、すでに質問されている場合は、リンクしてください。

4

3 に答える 3

2
order_items.select { |item| uri.none? { |u| u.include?(item) } }
于 2013-02-12T11:37:06.170 に答える
2

バリアントとして:

order_items.select{|i| !uri.join.include? i}

アップデート

order_items=["2832","3284","9832","9234"]
uri=["orderaccept/order_items/3284/cancel","orderaccept/order_items/9234/cancel"]

require 'benchmark'
joined = uri.join
n = 1_000_000
Benchmark.bm do |x|
  x.report("select:") { n.times do  order_items.select{|i| !uri.join.include? i}; end }
  x.report("reject:") { n.times do  order_items.reject{|i| uri.join.include? i}; end }
  x.report("reject2:") { n.times do  order_items.reject{|i| joined.include? i}; end }
  x.report("none?:") { n.times do  order_items.select { |item| uri.none? { |u| u.include?(item) } }; end }
  x.report("substr:") { n.times do  order_items - uri.map { |e| e.gsub /\D/, '' }; end }
  x.report("subt+substr:") {n.times do order_items - uri.map { |i| i[24..27] }; end }
end

生産しました

               user       system      total        real
select:       4.181000   0.015000   4.196000 (  4.275000)
reject:       3.931000   0.000000   3.931000 (  3.925000)
reject2:      1.388000   0.000000   1.388000 (  1.440000)
none?:        4.462000   0.000000   4.462000 (  4.490000)
substr:       26.582000  0.016000   26.598000( 26.675000)
subt+substr:  3.167000   0.000000   3.167000 (  3.170000)
于 2013-02-12T11:40:34.260 に答える
0

配列の減算は、将来のコードリビジョンに対して自己記述的であるため、ここでより適切だと思います(配列から不要な項目を減算してもかまいませんか?)

order_items - uri.map { |e| e.gsub /\D/, '' }

UPD Ooups…ベンチマークは、私に正確に考えることを強制します。たとえば、次のようになりました。

order_items - uri.map { |i| i[24..27] }

ベンチマーク:

order_items=["2832","3284","9832","9234"]
uri=["orderaccept/order_items/3284/cancel","orderaccept/order_items/9234/cancel"]

require 'benchmark'
n = 1_000_000
Benchmark.bm do |x|
  x.report("select:") { n.times do  order_items.select{|i| !uri.join.include? i}; end }
  x.report("reject:") { n.times do  order_items.reject{|i| uri.join.include? i}; end }
  x.report("none?:") { n.times do  order_items.select { |item| uri.none? { |u| u.include?(item) } }; end }
  x.report("subt+gsub:") { n.times do order_items - uri.map { |e| e.gsub /\D/, '' }; end }
  x.report("subt+substr:") {n.times do order_items - uri.map { |i| i[24..27] }; end }
end

降伏:

       user     system      total        real
select:  7.200000   0.000000   7.200000 (  7.206846)
reject:  6.240000   0.000000   6.240000 (  6.253924)
none?:  9.230000   0.020000   9.250000 (  9.282425)
subt+gsub: 43.440000   0.000000  43.440000 ( 43.491133)
subt+substr:  5.320000   0.010000   5.330000 (  5.333616)
于 2013-02-12T12:00:32.873 に答える