2009-12-01 84 views
2

我有這個小代碼片段。收集所有不使用Ruby

我不知道紅寶石,我認爲這是一個很好的應用它的機會。

我想打印文件e中不在文件c中的所有行。每一行都是一個數字。

這是我的本錢:

e = File.new('e').readlines 
c = File.new('c').readlines 

x = e.collect do |item| 
    c.include?(item) ? "" : item 
end 

p x.sort 

的問題是,這兩個文件可能具有空的空間,由於這個原因相同數量可能不會被認爲是這樣的。 (例如,「1234」不同於「1234」)

我需要在我的代碼中修復它嗎?我試過c.include?(item.strip) ..但似乎沒有工作。

回答

3

也許做strip當你做readlines會有所幫助,即

e = File.readlines('e').map{|x| x.strip} 
c = File.readlines('c').map{|x| x.strip} 

那麼你可以使用collect像你一樣,或者select如果你不希望空字符串:

x = e.select{|i| !c.include?(i)} 

編輯:或Benno表明,使用

x = e-c 
+1

實際上,X = E - C必須工作,以及 – Benno 2009-12-01 23:31:52

+0

E-C? ..不錯... – OscarRyz 2009-12-02 00:46:43

1

您可以將項目轉換爲實際的數字。另外,您應該在閱讀這些文件後關閉這些文件。 File.new打開但不關閉。您可以在一個塊中打開它以自動關閉它。請嘗試:

e = nil 
c = nil 
File.open('e'){|file| 
    e = file.readlines 
    e.map!{|x| x.to_i} 
} 
File.open('c'){|file| 
    c = file.readlines 
    c.map!{|x| x.to_i} 
} 

創建數組數組。

3

兩件事情:

  • 您可以使用套
  • 減號來爲什麼不能轉換爲整數,如果每一行是一個整數?

    File.readlines("e").map(&:to_i) - File.readlines("c").map(&:to_i)