我想删除数组中最小值的第一个实例。
arr = [1,2,3,1,2,3]
arr.reject {|i| i == arr.min}
#=> [2,3,2,3]
但是我的代码删除了数组中所有最小值的实例。我想要这样的结果:
[...]
#=> [2,3,1,2,3]
解决此问题的最佳方法是什么?
答案 0 :(得分:3)
第一次脸红时,有两个选择:
arr.delete_at(arr.index(arr.min))
# or less readable but still valid
arr.delete_at arr.index arr.min
arr.delete_at(arr.each_with_index.min[1])
# or
arr.delete_at(arr.each_with_index.min.pop)
# or
arr.delete_at(arr.each_with_index.min.last)
第一个是更少的代码,更易读,但是在列表中进行了两次而不是一次。我怀疑是否还有其他构造会在(可能(或可能不会)如此丑陋的)优雅方面超过选项#1。
请注意,这两个选择都会在一个空数组上崩溃。这是一个更安全的版本:
arr.delete_at arr.index(arr.min) || 0
答案 1 :(得分:1)
只是出于好奇:
[1,2,3,1,2,3].tap { |a| a.delete_at a.each_with_index.min.last }
#⇒ [2, 3, 1, 2, 3]
答案 2 :(得分:1)
您可以为此目的使用Enumerable#drop_while
arr = [1,2,3,1,2,3]
arr.drop_while { |i| i == arr.min }
#=> [2, 3, 1, 2, 3]