我在读红宝石里的文件时有问题。
我试图读取文件的每一行,根据字符将其拆分,并将其存储到数组中。与每一行相对应的数组都有信息。我想检查该数组是否包括"u“、"d”、"l“或"r”等字符,如下所示。
如果该行不包括任何这些字符,我会将计数变量增加一个。
计数-= 1只考虑了一个基本情况。
我的问题是这让我数错了。例如,使用一个文本文件读取:
4 0 0 3 3
0 0 d 0.391538986557049
0 1 ur 63.1258159853081 3.14882640637611
0 2 rd 0.0148854629087619 0.019301544005463
0 3 u 15.6415340291405计数应该是0。
def compute_closed(file)
count = 0
while line = file.gets do
array = line.split(//)
answer = array.include?("u" || "d" || "l" || "r")
if answer != true
count += 1
end
end
count -= 1
puts count
end发布于 2014-02-13 19:01:59
也许您有理由将行分成几个部分,但是如果您只是在行的某个位置检查这些字符,为什么不使用正则表达式呢?
def compute_closed(file)
count = 0
while line = file.gets do
count += 1 if line =~ /[udlr]/
end
count -= 1
puts count
end发布于 2014-02-13 19:24:52
如果您绝对需要将行拆分成字符,那么您可能希望使用sets而不是数组:
def compute_closed(file)
count = 0
while line = file.gets do
cmp_set = Set.new ['u', 'd', 'l', 'r']
input_set = Set.new(line.split(//))
if input_set.intersection(cmp_set).size == 0
count += 1
end
end
count -= 1
puts count
end发布于 2014-02-13 20:55:18
编辑:发帖后,我看到我的答案与@Philip的基本相同,但我会把它留给稍微不同的处理方式。
有很多方法可以做到这一点。这是另一个:
File.read('f1').each_line.reduce(0) {|t,s| t + (s =~ /[udlr]/ ? 0 : 1)} - 1我们试试看:
text =<<_
Now is the time
for all good
Rubiests to
spend some
time in Hawaii.
_
File.write('f1', text)
File.read('f1').each_line.reduce(0) {|t,s| t+(s =~ /[udlr]/ ? 0 : 1)} - 1 #=> 1它返回2 - 1 => 1,因为如果在除第一行和最后一行之外的所有行中都找到'u‘、'd’、'l‘或'r’。
一开始,我
File.read(fname).each_line.each_with_object(0) {|s,t|
t += 1 unless s =~ /[udlr]/ } - 1但t不会增加。我很困惑,于是发电子邮件给我的朋友@ArupRakshit,我总是可以指望他知道答案,或者一直挖到他找到答案为止。It 结果发现 in
...each_with_object(memo) {|s,memo|memo必须是一个可变对象,这是该方法与reduce/inject之间的一个重要区别(在对象的Rubydocsfor对象中没有明确说明)。谢谢,阿罗普。
https://stackoverflow.com/questions/21762298
复制相似问题