1

私は2つのアレイを持っています

a = [1,2,3,4]  
b = [a,b,c,d,e,f]

作成するために組み合わせる必要があるもの:

c = [[1,a],[1,b],[1,c],[1,d],[1,e],[1,f],[2,a],[2,b],...]

productRubyバージョン1.9以降でこのメソッドを使用しますが、古いバージョンのRubyを実行しており、このメソッドは存在しません。cメソッドを使用せずに作成する方法がわかりませんproduct。何か提案はありますか?

4

6 に答える 6

3
a.map {|ma| b.map { |mb| [ma, mb]} }
于 2013-02-02T15:31:08.300 に答える
2
class Array
  def product(other)
    if block_given? then
      each {|el| other.each {|other_el| yield [el, other_el]}}
    else
      res=[]
      each{|el| other.each {|other_el| res << [el, other_el]}}
      res
    end
  end
end

a = [1,2,3,4]  
b = %w(a b c d e f)

p a.product(b) #[[1, "a"], [1, "b"], [1, "c"],...
a.product(b){|e| puts e.join}
#1a
#1b
#1c
#1d...

最近のRubyバージョンではreturn to_enum unless block_given?、このコードのどこかにありますが、AFAIKto_enumは古いRubiesでは使用できません。実数productは複数の引数を取ります。私はまだその非再帰的な方法を見つけていません。

于 2013-02-02T21:06:48.340 に答える
1
c = a.map{|x| b.map{|y| [x,y]}}.flatten(1)

Rubyのバージョンの古さによっては、次のものを使用する必要があります。

c = a.map{|x| b.map{|y| [x,y]}}.inject([],:concat)
于 2013-02-02T19:11:17.987 に答える
1

あなたがしているのは、デカルト積を取得しようとしていることです。

CartesianArrayメソッドを継承しArrayて提供するというクラスを作成しました#product

class CartesianArray < Array

  def initialize(array_one, array_two)
    @array_one, @array_two = array_one, array_two
  end

  def product
    results = []
    @array_one.each do |a1|
      @array_two.each do { |a2| results << [a1, a2] }
    end

    results
  end

end

あなたはそれをこのように使うことができます:

# Test Code
numbers = [1,2,3,4]
letters = ['a','b','c','d','e','f']

cart_array = CartesianArray.new(numbers, letters)
p cart_array.product
[[1, "a"], [1, "b"], [1, "c"], [1, "d"], [1, "e"], [1, "f"], [2, "a"], [2, "b"], [2, "c"], [2, "d"], [2, "e"], [2, "f"], [3, "a"], [3, "b"], [3, "c"], [3, "d"], [3, "e"], [3, "f"], [4, "a"], [4, "b"], [4, "c"], [4, "d"], [4, "e"], [4, "f"]]

そのクラスに保持したくない場合は、メソッドを引き出して、#productコードに合うように変更できると確信しています。

于 2013-02-02T22:11:32.320 に答える
0

確かに、それを行うためのより簡単で効率的な方法があります-

(a+b).combination(2).map {|c| c if a.include?(c.join.to_i)}.compact

しかし、私はあなたがRubyで書くことができるさまざまな可能なワンライナーを楽しんでいます。

于 2013-02-02T15:47:07.240 に答える
0

バックポートの宝石

Array#product古いルビーを入手する最も簡単な方法は、バックポートの宝石を使用することです。このメソッドをRuby1.87およびRuby1.9.2に追加します。

于 2014-11-11T13:12:01.240 に答える