我写了一个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()
答案 0 :(得分:6)
这是两件事的结合。
for i in 1..arrayLength
,它遍历array
中的最后一个元素。在最后一个元素之后,array[i]
为nil
。if array[i].to_i < minNo
,即使array[i]
不是数字,也可以满足。因此,nil
在最后一个元素之后返回的array[i]
满足因nil.to_i
为0
而导致的条件,并且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_MAX
和FIXNUM_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)
以最简单的方式,您可以使用数组的max
和min
方法。
: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