Ruby数组 - 最高整数

时间:2011-08-03 17:16:37

标签: ruby arrays each

Ruby的新手,并且喜欢它。只是玩下面的代码:

    public
    def highest 
      highest_number = 0
      each do |number|
        number = number.to_i
        highest_number = number if number > highest_number
        puts highest_number 
      end
    end


    array = %w{1 2 4 5 3 8 22 929 1000 2}
    array.highest

所以我得到的回应是:

    1
    2
    4
    5
    5
    8
    22
    929
    1000
    1000

因此它将数组放在第一位,然后是数组中的最高位数。但是我想要的只是最高数字...

我玩过这个并且无法解决这个问题!对不起这样的新手问题

3 个答案:

答案 0 :(得分:7)

问题是你在puts循环中有each语句,因此在每次迭代中它会打印出当前最高的数字。尝试将其移到each循环之外,这样就可以了:

public

def highest
  highest_number = 0
  each do |number| 
    number = number.to_i
    highest_number = number if number > highest_number
  end
  puts highest_number
end

array = %w{1 2 4 5 3 8 22 929 1000 2}
array.highest

产生所需的输出:

1000

答案 1 :(得分:5)

使用max_by

也可以省去一些麻烦
>> a = %w{1 2 4 5 3 8 22 929 1000 2}
=> ["1", "2", "4", "5", "3", "8", "22", "929", "1000", "2"]
>> m = a.max_by { |e| e.to_i }
=> "1000"

您还可以使用其他版本的max_by

m = a.max_by(&:to_i)

避免“只调用方法的块”的额外噪音。

但这可能是一个Ruby块学习练习,因此使用标准库的现有部分并不重要。 OTOH,很高兴知道标准库中有什么内容,因此max_bymax也可以算作学习练习。

答案 2 :(得分:1)

您可以改为执行此操作,并避免使用highest_number变量。

array = %w{1 2 4 5 3 8 22 929 1000 2}

class Array
  def highest
    collect { |x| x.to_i }. \
    sort.                   \
    last.to_i
  end
end

array.highest # 1000

在这种情况下,collect { |x| x.to_i }也可以写为collect(&:to_i)