2012-10-11 93 views
1

我正在研究一個問題,我需要創建一個CartesianProduct類。我應該能夠通過這個2類列表,然後輸出這些列表的Cartesian產品(所有可能的組合)。難以輸出二維數組

到目前爲止,我可以從這個類創建一個對象,創建所有可能的組合,但是當我嘗試將這些結果輸出到屏幕時,我會在它自己的行上獲取每個項目,就好像它沒有意識到它是一個數組。

我的代碼:

class CartesianProduct 
    include Enumerable 
    # Your code here 
    def initialize(a,b) 
     @output = [] 
     a.each do |x| 
      b.each do |y| 
       if !(output.include? [x,y]) 
        output << [x,y] 
       end 
      end 
     end 
    end 

    #getter 
    def output 
     @output 
    end 

    def each 
     @output.each do |a| puts a end 
    end 

    #setter 
    def output=(a,b) 
     a.each do |x| 
      b.each do |y| 
       if !(output.include? [a,b]) 
        output << [a,b] 
       end 
      end 
     end 
    end 
end 

使用測試即時通訊什麼:

c = CartesianProduct.new([:a,:b], [4,5]) 
=> #<CartesianProduct:0x93569f8 @output=[[:a, 4], [:a, 5], [:b, 4], [:b, 5]]> 

測試是通過以下命令來完成:c.each { |elt| puts elt.inspect }

我得到:

irb(main):1403:0> c.each { |elt| puts elt.inspect } 
a 
4 
a 
5 
b 
4 
b 
5 
=> [[:a, 4], [:a, 5], [:b, 4], [:b, 5]] 

但是我 應該得到:

# [:a, 4] 
# [:a, 5] 
# [:b, 4] 
# [:b, 5] 

我的輸出不打印symbols的符號,而是轉換爲字符串,其打印上自己的每一項目...

這是家庭作業,所以我不是在尋找答案,而是在正確的方向推動會有所幫助。

編輯 =========================================== ============================= 在類中更改我的定義each解決了此問題。

def each 
    @output.map do |x| 
     yield x 
    end 
end 

回答

0

更改我在類中的每個定義解決了這個問題。

def each 
    @output.map do |x| 
     yield x 
    end 
end 
1

你的問題是,你是在c應用each,這是CartesianProduct一個實例。你需要在@output上做each。至於如何從外部訪問@output,您應該知道;這是一件基本的事情。

+0

即使我定義'each'我的課裏面?我想當我這樣做,然後調用'c.each'它會使用我的方法引用'@輸出'? – ProfessionalAmateur

+0

好吧,現在我明白你在做什麼了。或者1)取出你的'each'的定義,當你做'each'時調用'@ output'。這個定義很奇怪。或者,2)如果你在定義'each'堅持,那麼你必須使用'inspect'那裏,當你調用'each',所有你需要的是'c.each',僅此而已。 – sawa

+0

我敢肯定,這是非常奇怪的,非常新的Ruby用戶。 :)當我拿出我的每一個並且運行測試,我得到一切一行。 '=> [[:一,4],[:一,5],[:B,4],[:B,5]]' – ProfessionalAmateur

0

我剛開始使用Ruby,但我想我找到了原因: 當你調用c.each { |elt| puts elt.inspect } 它第一次執行你在類中定義的電話。其結果是在測試{ |elt| puts elt.inspect }中傳遞給塊的字符串,它們將它們分開分開。

+0

考慮標誌着這是問題回答將其關閉。 – sunnyrjuneja

0

你在CartesianProduct實施#each不接受一個塊,所以,對於一個實例c,傳遞一個塊c.each沒有影響。試試這個:

c.each { |elt| raise "an error!" } 

# no error is raised because the block is not called. 

現在,您的each定義呼籲在@output每個陣列puts。陣列上調用puts將遍歷每個元素,即使在嵌套數組(換句話說,數組的扁平版):

ruby-1.9.3-p125 :006 > puts [1,2,[3,4]] 
1 
2 
3 
4 
=> nil 

我相信你想要的東西是each的實現,通過給定塊到@output的每種方法:

def each(&block) 
    @output.each(&block) 
end