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

Edit: или Benno предлагает использовать

x = e-c 
+1

На самом деле, х = е - с должна работать, а – Benno

+0

е-с? .. хороший ... – OscarRyz

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) 
Смежные вопросы