数组中的最大值和最小值

时间:2014-06-14 02:58:58

标签: ruby arrays

我写了一个Ruby代码来从数组中获取max和min值。代码打印最大值(8)正确,但它不打印最小值(2)。请告诉我代码中出了什么问题。

class MaxMinArray
  def MaxMinMethod()
    array = [4,2,8,3,5]
    maxNo = array[0]
    minNo = array[0]
    arrayLength = array.length
    for i in 1..arrayLength
      if array[i].to_i > maxNo
        maxNo = array[i]
      end
      if array[i].to_i < minNo
        minNo = array[i]
      end
    end
    puts "Maximum no. in the given array: " + maxNo.to_s
    puts "Minimum no. in the given array: " + minNo.to_s
  end
end

MaxiMinArrayObj = MaxMinArray.new
MaxiMinArrayObj.MaxMinMethod()

7 个答案:

答案 0 :(得分:6)

这是两件事的结合。

  • 首先,您迭代for i in 1..arrayLength,它遍历array中的最后一个元素。在最后一个元素之后,array[i]nil
  • 其次,您的条件为if array[i].to_i < minNo,即使array[i]不是数字,也可以满足。

因此,nil在最后一个元素之后返回的array[i]满足因nil.to_i0而导致的条件,并且nil已分配到minNo

答案 1 :(得分:5)

只要您想将结果用于其他内容,打印内部方法就不是一个好习惯。

Ruby还提供了各种魔术方法来获取数组的最大值和最小值:

results = [5, 23, 43, 2, 3, 0].minmax
puts "Maximum no. in the given array: " + results[1]
puts "Minimum no. in the given array: " + results[0]

答案 2 :(得分:4)

我意识到您正在尝试学习如何编码,但是,当您这样做时,学习利用预先存在的解决方案也很重要。重新发明轮子会浪费你的时间调试代码。

我写代码如下:

def max_min(ary)
  [ary.max, ary.min]
end

max_min([1,2,4]) # => [4, 1]

但是,再一次,Ruby已经有了一个很好的minmax方法:

[1,2,4].minmax # => [1, 4]

所以使用它并将精力集中在更有趣的事情上。

如果必须以相反的顺序查看值,请使用:

[1,2,4].minmax.reverse # => [4, 1]

更详细/更老式的做法是:

FIXNUM_MAX = (2 ** (0.size * 8 - 2) - 1)
FIXNUM_MIN = -(2 ** (0.size * 8 - 2))

def max_min(ary)
  return [nil, nil] if ary.empty?
  minval = FIXNUM_MAX
  maxval = FIXNUM_MIN
  ary.each do |i|
    minval = i if i < minval
    maxval = i if i > maxval
  end
  [maxval, minval]
end

max_min([1,2,4]) # => [4, 1]
[1,2,4].minmax.reverse # => [4, 1]

简单地遍历数组,检查每个值以查看它是小于还是大于最后一个最小值或最大值,如果是,则记住它。阵列耗尽后,将返回值。它更加简洁,因为使用each消除了尝试使用索引值遍历数组的麻烦。我们几乎从不在Ruby中使用for,尤其是遍历数组。

(从技术上讲,Ruby可以保持超出4611686018427387903和-4611686018427387904的值,这是FIXNUM_MAXFIXNUM_MIN的值,但这些对于我们想要做的大多数事情都是足够的。)

答案 3 :(得分:2)

你应该从1迭代到arrayLength - 1(它是最后一个元素的索引)。你可以使用三个点:

for i in 1...arrayLength

答案 4 :(得分:1)

如果我不被允许使用Ruby的minmax方法,那么我可能会这样做:

array = [4,2,8,3,5]

min, max = nil, nil
array.each do |element|
  min = element if min.nil? || element < min
  max = element if max.nil? || max < element
end

puts [min, max]
# => [2, 8]

答案 5 :(得分:1)

我在红宝石中使用了这个表达式的最小值和最大值,这是一段时间,但它有效

class RubyMinMax

def self.min_function(array=[])
    puts "my array is the following #{array}"
    puts "the length of the array is #{array.length}"
    it = 0
    while array.length > 1
        array.fetch(it).to_i > array.fetch(it-1).to_i ? array.delete_at(it) : array.delete_at(it-1)
        it = array.length-1
    end
    print array[0]
end

def self.max_function(array=[])
    puts "my array is the following #{array}"
    puts "the length of the array is #{array.length}"
    it = 0
    while array.length > 1
        array.fetch(it).to_i < array.fetch(it-1).to_i ? array.delete_at(it) : array.delete_at(it-1)
        it = array.length-1
    end
    print array[0]
end
end

RubyMinMax.min_function([18, 19, 17])

RubyMinMax.max_function([18, 19, 17])

答案 6 :(得分:0)

以最简单的方式,您可以使用数组的maxmin方法。

:001 > [1,4,1,3,4,5].max
 => 5 
:002 > [1,4,1,3,4,5].min
 => 1 

如果您的数组可能包含nil第一个compact,那么使用min max

例如

:003 > [1,4,1,3,4,5,nil].compact
=> [1, 4, 1, 3, 4, 5]

:004 > [1,4,1,3,4,5].max
 => 5 

:005 > [1,4,1,3,4,5].min
 => 1