首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Ruby文件读取

Ruby文件读取
EN

Stack Overflow用户
提问于 2014-02-13 18:15:25
回答 3查看 119关注 0票数 0

我在读红宝石里的文件时有问题。

我试图读取文件的每一行,根据字符将其拆分,并将其存储到数组中。与每一行相对应的数组都有信息。我想检查该数组是否包括"u“、"d”、"l“或"r”等字符,如下所示。

如果该行不包括任何这些字符,我会将计数变量增加一个。

计数-= 1只考虑了一个基本情况。

我的问题是这让我数错了。例如,使用一个文本文件读取:

代码语言:javascript
复制
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。

代码语言:javascript
复制
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
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-02-13 19:01:59

也许您有理由将行分成几个部分,但是如果您只是在行的某个位置检查这些字符,为什么不使用正则表达式呢?

代码语言:javascript
复制
def compute_closed(file)
    count = 0
    while line = file.gets do
        count += 1 if line =~ /[udlr]/
    end
    count -= 1
    puts count
end
票数 1
EN

Stack Overflow用户

发布于 2014-02-13 19:24:52

如果您绝对需要将行拆分成字符,那么您可能希望使用sets而不是数组:

代码语言:javascript
复制
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
票数 0
EN

Stack Overflow用户

发布于 2014-02-13 20:55:18

编辑:发帖后,我看到我的答案与@Philip的基本相同,但我会把它留给稍微不同的处理方式。

有很多方法可以做到这一点。这是另一个:

代码语言:javascript
复制
File.read('f1').each_line.reduce(0) {|t,s| t + (s =~ /[udlr]/ ? 0 : 1)} - 1

我们试试看:

代码语言:javascript
复制
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’。

一开始,我

代码语言:javascript
复制
 File.read(fname).each_line.each_with_object(0) {|s,t|
   t += 1 unless s =~ /[udlr]/ } - 1

t不会增加。我很困惑,于是发电子邮件给我的朋友@ArupRakshit,我总是可以指望他知道答案,或者一直挖到他找到答案为止。It 结果发现 in

代码语言:javascript
复制
...each_with_object(memo) {|s,memo|

memo必须是一个可变对象,这是该方法与reduce/inject之间的一个重要区别(在对象的Rubydocsfor对象中没有明确说明)。谢谢,阿罗普。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21762298

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档