假设我有一个数组,即arr
:[1, 2, 3, 4, 8, 8]
,我想找到这个数组中的所有最大元素:
arr.allmax # => [8, 8]
是否有内置的方法组合来解决这个问题?我不想像现在这样做补丁:
class Array
def allmax
max = self.max
self.select { |e| e == max }
end
end
猴子补丁不是一个好主意,我可以这样做:
some_array.select { |e| e == some_array.max }
它将作为allmax
。感谢所有关于灵感的答案和评论。
答案 0 :(得分:1)
这是一种方式:
2.1.0 :006 > arr = [1, 2, 3, 4, 8, 8]
=> [1, 2, 3, 4, 8, 8]
2.1.0 :007 > arr.group_by { |i| i }.max.last
=> [8, 8]
2.1.0 :008 >
这是一种方法: -
def all_max(arr)
return [] if arr.empty?
arr.group_by { |i| i }.max.last
end
答案 1 :(得分:1)
这是一种有趣的方式。
arr.sort!.slice arr.index(arr[-1]) || 0..-1
对数组进行排序,然后找到与数组最右边索引匹配的数组的最左边索引,并获取与该范围匹配的子切片(如果数组为空,则为0 ..- 1)。
这个很有趣,因为它不需要中间数组,但它会改变输入以实现单行。
答案 2 :(得分:1)
另一种方式:
def all_max(arr)
return [] if arr.empty?
mx = arr.max
[mx] * arr.count { |e| e == mx }
end
all_max([1, 2, 3, 4, 8, 8])
#=> [8, 8]
要在一次传递中构造数组,您可以这样做:
arr.each_with_object([]) do |e,a|
if a.empty?
a << e
else
case e <=> a.first
when 0 then a << e
when 1 then a.replace([e])
end
end
end