【问题标题】:Ruby file readingRuby 文件读取
【发布时间】:2014-02-13 18:15:25
【问题描述】:

我在 ruby​​ 中读取文件时遇到问题。

我正在尝试读取文件的每一行,根据字符对其进行拆分,然后将其存储到一个数组中。对应于每一行的那个数组有信息。我想检查该数组是否包含字符“u”“d”“l”或“r”,如下所示。

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

count -= 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

count 应该是 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

【问题讨论】:

  • 亲爱的array.include?("u" || "d" || "l" || "r") 无效。它只需要一个参数。
  • 哦,好的,谢谢。你能告诉我一个等效的吗?
  • 你给我们实际的文本文件内容,以及预期的输出
  • 给@ArupRakshit 实际的文本文件和 10 秒(最大):-)
  • 我们无法像这样知道您的文本文件的行。请编辑您的帖子和代码格式文本文件。

标签: ruby file text


【解决方案1】:

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

def compute_closed(file)
    count = 0
    while line = file.gets do
        count += 1 if line =~ /[udlr]/
    end
    count -= 1
    puts count
end

【讨论】:

    【解决方案2】:

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

    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
    

    【讨论】:

      【解决方案3】:

      编辑:发布后,我发现我的答案与@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 =&gt; 1,因为如果在除第一行和最后一行之外的所有行中都找到了“u”、“d”、“l”或“r”。

      最初,我有

       File.read(fname).each_line.each_with_object(0) {|s,t|
         t += 1 unless s =~ /[udlr]/ } - 1
      

      t 不会增加。我很困惑,所以给我的朋友@ArupRakshit 发了电子邮件,我总是可以指望他知道答案,或者挖掘直到他找到为止。它turns out that

      ...each_with_object(memo) {|s,memo|
      

      memo 必须是可变对象,这是该方法与reduce/inject 之间的重要区别(在Enumerable#each_with_object 的Ruby 文档中明确说明)。谢谢,Arup。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-12-30
        • 1970-01-01
        • 2014-04-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-01
        相关资源
        最近更新 更多