Соберите все, не используя Ruby - PullRequest
2 голосов
/ 02 декабря 2009

У меня есть небольшой фрагмент кода.

Я не знаю рубина, и я думаю, что это прекрасная возможность применить его.

Я хочу напечатать все строки в файле 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 ]

3 голосов
/ 02 декабря 2009

Две вещи:

  • Вы можете использовать оператор минус для множеств
  • почему бы не преобразовать в целые числа, если каждая строка является целым числом?

  File.readlines("e").map(&:to_i) - File.readlines("c").map(&:to_i)
3 голосов
/ 02 декабря 2009

Возможно, выполнение 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)}

Редактировать : или, как подсказывает Бенно , использовать

x = e-c
1 голос
/ 02 декабря 2009

Вы можете конвертировать предметы в фактические числа. Кроме того, вы должны закрывать эти файлы после чтения из них. 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}
}

Для создания массивов чисел.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...