2009-12-01 24 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)